অস্বীকৃতি
2014-12-01 আপডেট: নীচের উত্তরগুলি কেবলমাত্র CSV এর একটি খুব নির্দিষ্ট বিন্যাসের জন্য কাজ করে। হিসাবে সঠিকভাবে নির্দিষ্ট মন্তব্য ডিজি দ্বারা , এই সমাধান নেই না করা CSV এর জন্য RFC 4180 সংজ্ঞা মাপসই এবং এটি নেই না মাইক্রোসফট এক্সেল ফরম্যাটে মাপসই করা হবে। এই সমাধানটি সহজভাবে দেখায় যে কীভাবে কেউ ইনপুটটির একটি (অ-মানক) সিএসভি লাইনকে পার্স করতে পারে যার মধ্যে স্ট্রিং প্রকারের মিশ্রণ রয়েছে, যেখানে স্ট্রিংগুলিতে অবরুদ্ধ উদ্ধৃতি এবং কমা থাকতে পারে।
একটি অ-মানক সিএসভি সমাধান
অস্টিচেনি যেমন সঠিকভাবে উল্লেখ করেছে , আপনি যদি উদ্ধৃত অক্ষরগুলি থাকতে পারে এমন উদ্ধৃত স্ট্রিংগুলি সঠিকভাবে পরিচালনা করতে চান তবে আপনাকে শুরু থেকে স্ট্রিংটি শেষ করতে হবে। এছাড়াও, ওপিস একটি "সিএসভি স্ট্রিং" আসলে কী তা স্পষ্টভাবে সংজ্ঞায়িত করে না। প্রথমে আমাদের একটি বৈধ সিএসভি স্ট্রিং এবং এর স্বতন্ত্র মানগুলি নির্ধারণ করতে হবে।
প্রদত্ত: "সিএসভি স্ট্রিং" সংজ্ঞা
এই আলোচনার উদ্দেশ্যে, একটি "সিএসভি স্ট্রিং" শূন্য বা তার বেশি মান নিয়ে গঠিত, যেখানে একাধিক মান কমা দ্বারা পৃথক করা হয়। প্রতিটি মান সমন্বিত হতে পারে:
- একটি দ্বিগুণ উদ্ধৃত স্ট্রিং (আনসকেপড একক উদ্ধৃতি থাকতে পারে)।
- একটি একক উদ্ধৃত স্ট্রিং (আনসকেপড ডাবল কোটস থাকতে পারে)।
- একটি অ-উদ্ধৃত স্ট্রিং ( কোটস, কমা বা ব্যাকস্ল্যাশ নাও থাকতে পারে)।
- একটি ফাঁকা মান (একটি সমস্ত সাদা স্থান মান শূন্য বিবেচনা করা হয়।)
বিধি / নোট:
- উদ্ধৃত মানগুলিতে কমা থাকতে পারে।
- উদ্ধৃত মানগুলিতে পালানো কিছু থাকতে পারে, যেমন
'that\'s cool'
।
- উদ্ধৃতি, কমা বা ব্যাকস্ল্যাশযুক্ত মানগুলি অবশ্যই উদ্ধৃত করা উচিত।
- শীর্ষস্থানীয় বা পিছনের শ্বেত স্পেসযুক্ত মানগুলি অবশ্যই উদ্ধৃত করা উচিত।
- ব্যাকস্ল্যাশ সকল থেকে সরানো হয়েছে:
\'
একক উদ্ধৃত মানগুলিতে।
- ব্যাকস্ল্যাশ সকল থেকে সরানো হয়েছে:
\"
ডাবল উদ্ধৃত মানগুলিতে।
- অ-উদ্ধৃতিযুক্ত স্ট্রিংগুলি কোনও নেতৃস্থানীয় এবং পিছনে স্থানগুলি ছাঁটাই করা হয়।
- কমা বিভাজকের নিকটবর্তী সাদা স্থান থাকতে পারে (যা উপেক্ষা করা হবে)।
অনুসন্ধান:
একটি জাভাস্ক্রিপ্ট ফাংশন যা কোনও বৈধ সিএসভি স্ট্রিংকে (উপরে সংজ্ঞায়িত করা) স্ট্রিং মানগুলির অ্যারে রূপান্তর করে।
সমাধান:
এই সমাধানটি দ্বারা ব্যবহৃত নিয়মিত প্রকাশগুলি জটিল। এবং (আইএমএইচও) সমস্ত অ-তুচ্ছ নিয়মিত অভিব্যক্তিগুলি প্রচুর মন্তব্য এবং ইন্ডেন্টেশন সহ ফ্রি-স্পেসিং মোডে উপস্থাপন করা উচিত। দুর্ভাগ্যক্রমে, জাভাস্ক্রিপ্ট ফ্রি-স্পেসিং মোডের অনুমতি দেয় না। সুতরাং, এই সমাধান দ্বারা প্রয়োগ করা নিয়মিত প্রকাশগুলি প্রথমে স্থানীয় নিয়মিত এক্সপ্রেশন বাক্য বাক্য গঠন উপস্থাপন করা হয় (পাইথনের হ্যান্ডি r'''...'''
কাঁচা-মাল্টি-লাইন-স্ট্রিং সিনট্যাক্স ব্যবহার করে প্রকাশ করা হয় )।
প্রথমে এখানে একটি নিয়মিত প্রকাশ যা একটি সিভিএস স্ট্রিং উপরের প্রয়োজনীয়তাগুলি পূরণ করে যাচাই করে:
একটি "সিএসভি স্ট্রিং" যাচাই করার জন্য নিয়মিত অভিব্যক্তি:
re_valid = r"""
# Validate a CSV string having single, double or un-quoted values.
^ # Anchor to start of string.
\s* # Allow whitespace before value.
(?: # Group for value alternatives.
'[^'\\]*(?:\\[\S\s][^'\\]*)*' # Either Single quoted string,
| "[^"\\]*(?:\\[\S\s][^"\\]*)*" # or Double quoted string,
| [^,'"\s\\]*(?:\s+[^,'"\s\\]+)* # or Non-comma, non-quote stuff.
) # End group of value alternatives.
\s* # Allow whitespace after value.
(?: # Zero or more additional values
, # Values separated by a comma.
\s* # Allow whitespace before value.
(?: # Group for value alternatives.
'[^'\\]*(?:\\[\S\s][^'\\]*)*' # Either Single quoted string,
| "[^"\\]*(?:\\[\S\s][^"\\]*)*" # or Double quoted string,
| [^,'"\s\\]*(?:\s+[^,'"\s\\]+)* # or Non-comma, non-quote stuff.
) # End group of value alternatives.
\s* # Allow whitespace after value.
)* # Zero or more additional values
$ # Anchor to end of string.
"""
যদি কোনও স্ট্রিং উপরের নিয়মিত অভিব্যক্তির সাথে মিলে যায়, তবে সেই স্ট্রিংটি একটি বৈধ CSV স্ট্রিং (পূর্বে বর্ণিত নিয়ম অনুসারে) এবং নিম্নলিখিত নিয়মিত অভিব্যক্তিটি ব্যবহার করে পার্স করা যেতে পারে। নিম্নলিখিত নিয়মিত অভিব্যক্তিটি তখন CSV স্ট্রিং থেকে একটি মান মেলে ব্যবহার করা হয়। আর কোনও মিল না পাওয়া পর্যন্ত এটি বারবার প্রয়োগ করা হয় (এবং সমস্ত মানকে বিশ্লেষণ করা হয়েছে)।
একটি বৈধ CSV স্ট্রিং থেকে একটি মান পার্স করতে নিয়মিত অভিব্যক্তি:
re_value = r"""
# Match one value in valid CSV string.
(?!\s*$) # Don't match empty last value.
\s* # Strip whitespace before value.
(?: # Group for value alternatives.
'([^'\\]*(?:\\[\S\s][^'\\]*)*)' # Either $1: Single quoted string,
| "([^"\\]*(?:\\[\S\s][^"\\]*)*)" # or $2: Double quoted string,
| ([^,'"\s\\]*(?:\s+[^,'"\s\\]+)*) # or $3: Non-comma, non-quote stuff.
) # End group of value alternatives.
\s* # Strip whitespace after value.
(?:,|$) # Field ends on comma or EOS.
"""
মনে রাখবেন যে এখানে একটি বিশেষ কেস মান রয়েছে যা এই নিয়মিত প্রকাশের সাথে মেলে না - যখন সর্বশেষ মানটি শূন্য থাকে। এই বিশেষ "খালি সর্বশেষ মান" কেসটি জাভাস্ক্রিপ্ট ফাংশনটির জন্য পরীক্ষা করা হয় এবং পরিচালনা করা হয় যা অনুসরণ করে follows
সিএসভি স্ট্রিং পার্স করতে জাভাস্ক্রিপ্ট ফাংশন:
function CSVtoArray(text) {
var re_valid = /^\s*(?:'[^'\\]*(?:\\[\S\s][^'\\]*)*'|"[^"\\]*(?:\\[\S\s][^"\\]*)*"|[^,'"\s\\]*(?:\s+[^,'"\s\\]+)*)\s*(?:,\s*(?:'[^'\\]*(?:\\[\S\s][^'\\]*)*'|"[^"\\]*(?:\\[\S\s][^"\\]*)*"|[^,'"\s\\]*(?:\s+[^,'"\s\\]+)*)\s*)*$/;
var re_value = /(?!\s*$)\s*(?:'([^'\\]*(?:\\[\S\s][^'\\]*)*)'|"([^"\\]*(?:\\[\S\s][^"\\]*)*)"|([^,'"\s\\]*(?:\s+[^,'"\s\\]+)*))\s*(?:,|$)/g;
if (!re_valid.test(text)) return null;
var a = [];
text.replace(re_value,
function(m0, m1, m2, m3) {
if (m1 !== undefined) a.push(m1.replace(/\\'/g, "'"));
else if (m2 !== undefined) a.push(m2.replace(/\\"/g, '"'));
else if (m3 !== undefined) a.push(m3);
return '';
});
if (/,\s*$/.test(text)) a.push('');
return a;
};
ইনপুট এবং আউটপুট উদাহরণ:
নিম্নলিখিত উদাহরণগুলিতে, কোঁকড়া ধনুর্বন্ধনীগুলি সীমিত করতে ব্যবহৃত হয় {result strings}
। (এটি শীর্ষস্থানীয় / পিছনে স্থান এবং শূন্য দৈর্ঘ্যের স্ট্রিংগুলি ভিজ্যুয়ালাইজ করতে সহায়তা করার জন্য))
var test = "'string, duppi, du', 23, lala";
var a = CSVtoArray(test);
var test = "";
var a = CSVtoArray(test);
var test = ",";
var a = CSVtoArray(test);
var test = "'one','two with escaped \' single quote', 'three, with, commas'";
var a = CSVtoArray(test);
var test = '"one","two with escaped \" double quote", "three, with, commas"';
var a = CSVtoArray(test);
var test = " one , 'two' , , ' four' ,, 'six ', ' seven ' , ";
var a = CSVtoArray(test);
অতিরিক্ত নোট:
এই সমাধানের জন্য সিএসভি স্ট্রিংটি "বৈধ" হওয়া দরকার। উদাহরণস্বরূপ, unquoted মান ব্যাকস্ল্যাশ বা উদ্ধৃতি, যেমন নিম্নলিখিত যে CSV স্ট্রিং নাও থাকতে পারে না বৈধ:
var invalid1 = "one, that's me!, escaped \, comma"
এটি প্রকৃতপক্ষে কোনও সীমাবদ্ধতা নয় কারণ যে কোনও উপ-স্ট্রিংকে একক বা ডাবল উদ্ধৃত মান হিসাবে উপস্থাপন করা যেতে পারে। এছাড়াও দ্রষ্টব্য যে এই সমাধানটি "কমা-বিভাজিত মানগুলির" জন্য কেবলমাত্র একটি সম্ভাব্য সংজ্ঞা উপস্থাপন করে।
ইতিহাস সম্পাদনা করুন
- 2014-05-19: অস্বীকৃতি যুক্ত করা হয়েছে।
- 2014-12-01: অস্বীকৃতি শীর্ষে সরানো হয়েছে।