সিএসভি ফর্ম্যাটটি কি একটি রেজেক্স দ্বারা সংজ্ঞায়িত করা যেতে পারে?


19

একজন সহকর্মী এবং আমি সম্প্রতি বিতর্ক করেছি যে খাঁটি রেজেক্স পুরোপুরি সিএসভি ফর্ম্যাটটি encaps করতে সক্ষম কিনা, যেমন এটি কোনও প্রদত্ত পালনের চর, উদ্ধৃতি চর এবং বিভাজক চর দ্বারা সমস্ত ফাইল পার্স করতে সক্ষম।

রেজেক্স তৈরির পরে এই বর্ণগুলি পরিবর্তন করতে সক্ষম হওয়ার প্রয়োজন নেই, তবে এটি অন্য কোনও প্রকার ক্ষেত্রে ব্যর্থ হবে না।

আমি যুক্তি দিয়েছি যে এটি কেবলমাত্র টোকেনাইজারের পক্ষে অসম্ভব। এটি করতে সক্ষম হতে পারে এমন একমাত্র রেইগেক্স একটি খুব জটিল পিসিআরই স্টাইল যা কেবল টোকেনাইজিংয়ের বাইরে চলে।

আমি এর লাইনে কিছু খুঁজছি:

... সিএসভি ফর্ম্যাটটি একটি প্রসঙ্গমুক্ত ব্যাকরণ এবং এর মতো, একমাত্র রেইগেক্সের সাহায্যে পার্স করা অসম্ভব ...

নাকি আমি ভুল করছি? কেবলমাত্র পসিক্স রেগেক্সের সাহায্যে সিএসভি পার্স করা সম্ভব?

উদাহরণস্বরূপ, যদি পালাবার চর এবং উদ্ধৃতি চর উভয় হয় "তবে এই দুটি লাইনই বৈধ csv:

"""this is a test.""",""
"and he said,""What will be, will be."", to which I replied, ""Surely not!""","moving on to the next field here..."

এটি কোনও সিএসভি নয় কারণ কোথাও বাসা বাঁধছে না (আইআইআরসি)
রাচেট ফ্রিক

1
তবে প্রান্তের মামলাগুলি কী? আমি কখনও ভেবেছি তার চেয়েও বেশি কিছু সিএসভিতে থাকতে পারে?
c69

1
@ c69 কীভাবে পালানো এবং উদ্ধৃতি চর উভয় সম্পর্কে "? তারপরে নিম্নলিখিতটি বৈধ:"""this is a test.""",""
স্পেনসার রথবুন

আপনি কি এখান থেকে রেজিপেক্স চেষ্টা করেছিলেন ?
dasblinkenlight

1
প্রান্তের ক্ষেত্রে আপনার নজর রাখা দরকার, তবে একটি রেজেক্স সিএসভি টোকানাইজ করতে সক্ষম হবে যেমন আপনি এটি বর্ণনা করেছেন। রেজেক্সের একটি নির্বিচার সংখ্যার উদ্ধৃতি গণনা করার প্রয়োজন নেই - এটি কেবল 3 হিসাবে গণনা করা প্রয়োজন, যা নিয়মিত প্রকাশ করতে পারে। অন্যরা যেমন উল্লেখ করেছে, আপনার
কোনও সিএসভি

উত্তর:


20

তাত্ত্বিকভাবে দুর্দান্ত, অনুশীলনে ভয়ানক

সিএসভি দ্বারা আমি ধরে নিচ্ছি যে আপনি কনভেনশনটির অর্থ আরএফসি 4180 তে বর্ণিত হিসাবে ।

বেসিক সিএসভি ডেটা মিলার সময় তুচ্ছ:

"data", "more data"

দ্রষ্টব্য: বিটিডাব্লু, এটি খুব সহজ এবং সু-কাঠামোগত তথ্যের জন্য স্প্লিট ('' ') ফাংশন ব্যবহার করার জন্য অনেক বেশি দক্ষ। স্টেট মেশিন) যা একবার আপনি পালানোর চরগুলির মতো প্রবণতা যুক্ত করতে শুরু করলে ব্যাকট্র্যাকিংয়ে অনেক সময় অপচয় করে।

উদাহরণস্বরূপ, আমি এখানে খুঁজে পেয়েছি সর্বাধিক বিস্তৃত নিয়মিত প্রকাশের সাথে মেলে স্ট্রিং:

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.
"""

এটি যুক্তিসঙ্গতভাবে একক এবং ডাবল উদ্ধৃত মানগুলি পরিচালনা করে তবে মানগুলিতে নিউলাইন নয়, পালানো উক্তি ইত্যাদি etc.

উত্স: স্ট্যাক ওভারফ্লো - আমি কীভাবে জাভাস্ক্রিপ্ট দিয়ে একটি স্ট্রিং পার্স করতে পারি

সাধারণ প্রান্ত-কেসগুলি চালু হওয়ার পরে এটি একটি দুঃস্বপ্ন হয়ে যায় ...

"such as ""escaped""","data"
"values that contain /n newline chars",""
"escaped, commas, like",",these"
"un-delimited data like", this
"","empty values"
"empty trailing values",        // <- this is completely valid
                                // <- trailing newline, may or may not be included

নতুন লাইনের হিসাবে মূল্য প্রান্তের কেসটি বন্যের মধ্যে পাওয়া RegEx ভিত্তিক পার্সারগুলির 99.9999% ভাঙতে যথেষ্ট। একমাত্র 'যুক্তিসঙ্গত' বিকল্পটি হল উচ্চ স্তরের বিশ্লেষণের জন্য ব্যবহৃত একটি স্টেট মেশিনের সাথে যুক্ত বেসিনাল কন্ট্রোল / নন-কন্ট্রোল ক্যারেক্টারের (যেমন টার্মিনাল বনাম নন-টার্মিনাল) টোকেনাইজেশনের সাথে টেকনাইজেশন জোড় করে RegEx ম্যাচিং ব্যবহার করা।

উত্স: অন্যথায় অভিজ্ঞতা ব্যথা এবং যন্ত্রণা হিসাবে পরিচিত।

আমি jquery-CSV এর লেখক , বিশ্বের একমাত্র জাভাস্ক্রিপ্ট ভিত্তিক, সম্পূর্ণ আরএফসি-কমপ্লায়েন্ট, সিএসভি পার্সার। আমি এই সমস্যাটি মোকাবেলা করতে, বহু বুদ্ধিমান লোকের সাথে কথা বলার, এবং কোর পার্সার ইঞ্জিনের 3 টি পুনর্লিখন সহ বিভিন্ন বাস্তবায়ন যদি একটি টোন চেষ্টা করে দেখেছি।

tl; dr - গল্পটির নৈতিক, পিসিআরই একমাত্র সবচেয়ে সাধারণ এবং কঠোর নিয়মিত (আই টাইপ-তৃতীয়) ব্যাকরণ ব্যতীত অন্য কোনও কিছুকে বিশ্লেষণের জন্য ব্যর্থ হয়। তবে এটি টার্মিনাল এবং টার্মিনাল নন-টার্মিনাল স্ট্রিংয়ের জন্য কার্যকর।


1
হ্যাঁ, এটি আমার অভিজ্ঞতাও ছিল। খুব সাধারণ সিএসভি প্যাটার্নের চেয়ে সম্পূর্ণ পুরোপুরি সজ্জিত করার যে কোনও প্রচেষ্টা এই বিষয়গুলির মধ্যে চলে এবং তারপরে আপনি দক্ষতার সমস্যা এবং একটি বিশাল রেইজেক্সের জটিলতা উভয়ের বিরুদ্ধে লড়াই করেন। আপনি নোড-সিএসভি লাইব্রেরি তাকিয়েছেন ? এটি এই তত্ত্বটিও বৈধ বলে মনে হচ্ছে। প্রতিটি অ-তুচ্ছ বাস্তবায়ন অভ্যন্তরীণভাবে পার্সার ব্যবহার করে।
স্পেন্সার রথবুন

@ স্পেন্সাররাথবুন ইয়েপ আমি নিশ্চিত যে আমি এর আগে নোড-সিএসভি উত্সটি একবার দেখেছি। এটি প্রক্রিয়াকরণের জন্য একটি সাধারণ চরিত্র টোকনাইজেশন রাজ্য মেশিন ব্যবহার করে বলে মনে হচ্ছে। আমি টার্মিনাল / নন-টার্মিনাল টোকেনাইজেশনের জন্য রেজেক্স ব্যবহার না করে jquery-csv পার্সার একই মৌলিক ধারণাটিতে কাজ করে। চার-বাই-চার ভিত্তিতে মূল্যায়ন ও মনগড়া করার পরিবর্তে, রেজেক্স একসাথে একাধিক নন-টার্মিনাল অক্ষরের সাথে মেলে এবং গ্রুপ হিসাবে (যেমন স্ট্রিং) ফেরত দিতে সক্ষম হয়। এটি অপ্রয়োজনীয় কনটেন্টেশনকে হ্রাস করে এবং 'উচিত' দক্ষতা বৃদ্ধি করে।
ইভান প্লেস

20

রেজেক্স যেকোন নিয়মিত ভাষার বিশ্লেষণ করতে পারে এবং পুনরাবৃত্ত ব্যাকরণগুলির মতো অভিনব বিষয়গুলি পার্স করতে পারে না। তবে সিএসভি মনে হচ্ছে বেশ নিয়মিত, তাই কোনও রেগেক্সের সাথে পার্সেবল।

আসুন সংজ্ঞা থেকে কাজ করুন : অনুমোদিত হ'ল ক্রম, পছন্দ ফর্ম বিকল্পগুলি ( |) এবং পুনরাবৃত্তি (ক্লিন তারকা, দ্য *)।

  • একটি অনাবৃত মান নিয়মিত: [^,]*# কোনও চর তবে কমা
  • একটি উদ্ধৃত মান নিয়মিত: "([^\"]|\\\\|\\")*"# উদ্ধৃতি "বা পালানো উদ্ধৃতি \"বা পালানো পালানো ছাড়া আর কোনও কিছুর ক্রম\\
    • কিছু ফর্মের সাথে উদ্ধৃতি সহ উদ্ধৃতি অবধি অন্তর্ভুক্ত থাকতে পারে, যা ("")*"উপরের অভিব্যক্তিতে একটি বৈকল্পিক যুক্ত করে।
  • একটি অনুমোদিত মান হ'ল নিয়মিত: <উদ্ধৃত- মান> |< উদ্ধৃত- মূল্য "
  • একটি সিএসভি লাইন নিয়মিত: <মান> (,<মান>)*
  • রেখার দ্বারা পৃথক করা একটি ক্রমও \nস্পষ্টতই নিয়মিত।

আমি এই প্রতিটি অভিব্যক্তিটির সাবধানতার সাথে পরীক্ষা করিনি, এবং ক্যাচ গ্রুপগুলি কখনই সংজ্ঞায়িত করিনি। আমিও কিছু পরিভাষা উপর glossed, অক্ষরের রূপগুলো যার পরিবর্তে ব্যবহার করা যেতে পারে মত ,, "অথবা লাইন বিভাজক: এই নিয়মানুবর্তিতা ভঙ্গ করবেন না, আপনি শুধু বিভিন্ন কিছুটা ভিন্ন ভাষায় পেতে।

আপনি যদি এই প্রমাণটিতে কোনও সমস্যা চিহ্নিত করতে পারেন তবে মন্তব্য করুন! :)

তবে এটি সত্ত্বেও, খাঁটি নিয়মিত প্রকাশের মাধ্যমে সিএসভি ফাইলগুলির ব্যবহারিক বিশ্লেষণ সমস্যাযুক্ত হতে পারে। পার্সারকে কোন রূপটি খাওয়ানো হচ্ছে তা আপনার জানা দরকার এবং এর কোনও মান নেই। একটি সাফল্য না হওয়া পর্যন্ত আপনি প্রতিটি লাইনের বিপরীতে বেশ কয়েকটি পার্সার চেষ্টা করতে পারেন, বা কোনওরূপে ফর্ম্যাট ফর্ম মন্তব্যগুলিকে ভাগ করতে পারেন। তবে এর জন্য দক্ষতার জন্য বা একেবারে নিয়মিত প্রকাশ ছাড়া অন্য উপায়ের প্রয়োজন হতে পারে।


4
ব্যবহারিক পয়েন্টের জন্য একেবারে একটি +1। এমন কিছু আছে যা আমি নিশ্চিত, কোথাও গভীর হ'ল একটি (স্বীকৃত) মানের একটি উদাহরণ যা উদ্ধৃত মান সংস্করণটি ভেঙে ফেলবে আমি কেবল এটি জানি না। একাধিক পার্সারের সাথে 'মজাদার' হবে "এই দুটি কাজ, তবে বিভিন্ন উত্তর দিন"

1
ব্যাকস্ল্যাশ-পলাতক-উদ্ধৃতি বনাম ডাবল-কোট-পলাতক-উদ্ধৃতিগুলির জন্য আপনার অবশ্যই স্পষ্টতই আলাদা আলাদা রেজিক্সের প্রয়োজন হবে। প্রাক্তন প্রকারের সিএসভি ক্ষেত্রের জন্য একটি রেজেক্সের মতো কিছু হওয়া উচিত [^,"]*|"(\\(\\|")|[^\\"])*"এবং পরেরটির মতো হওয়া উচিত [^,"]*|"(""|[^"])*"। (সাবধান, যেমন আমি এর
কোনটিও

জন্য শিকার কিছু রেকর্ড বিভেদক ঘিরা সঙ্গে একটি মান - যে একটি প্রমিত হতে পারে, একটি ক্ষেত্রে যে মিস হয়। এটি পরিচালনা করার একাধিক ভিন্ন উপায় থাকলে এটি ব্যবহারিক বিশ্লেষণকে আরও মজাদার করে তোলে

উত্তম উত্তর, তবে যদি আমি চালিয়ে perl -pi -e 's/"([^\"]|\\\\|\\")*"/yay/'পাইপ করি "I have here an item,\" that is a test\""তবে ফলাফলটি `ইয়ে এটি একটি পরীক্ষা \" "। আপনার রেজেক্স ত্রুটিযুক্ত তা বোঝায়।
স্পেন্সার রথবুন

@ স্পেনসারথ্যাথবুন: আমার আরও বেশি সময় পেলে আমি প্রকৃতপক্ষে রেজিক্সগুলি পরীক্ষা করব এবং সম্ভবত পরীক্ষার পাস হওয়া কিছু প্রুফ-অফ-কনসেপ্ট কোডটি পেস্ট করব। দুঃখিত, কাজের দিন চলছে।
9000

5

সহজ উত্তর - সম্ভবত না।

প্রথম সমস্যাটি একটি মানের অভাব lack যদিও কেউ তাদের সিএসভিকে এমনভাবে বর্ণনা করতে পারে যা কঠোরভাবে সংজ্ঞায়িত হয়, তবে কেউ সিএসভি ফাইলগুলি কঠোরভাবে সংজ্ঞায়িত করার আশা করতে পারে না। "আপনি যা করেন তাতে রক্ষণশীল হন, আপনি অন্যের কাছ থেকে যা গ্রহণ করেন তাতে উদার হন" -জোন পোস্টেল

ধরে নিই যে কারও কাছে একটি মানদণ্ড রয়েছে যা গ্রহণযোগ্য, সেখানে পালানোর চরিত্রগুলির প্রশ্ন রয়েছে এবং যদি এগুলি ভারসাম্যপূর্ণ হওয়া দরকার।

অনেক সিএসভি ফর্ম্যাটে একটি স্ট্রিং হিসাবে সংজ্ঞায়িত করা হয় string value 1,string value 2। যাইহোক, যদি সেই স্ট্রিংটিতে কমা থাকে তবে এটি এখন "string, value 1",string value 2। এটিতে একটি উদ্ধৃতি থাকলে তা হয়ে যায় "string, ""value 1""",string value 2

এই মুহুর্তে আমি বিশ্বাস করি এটি অসম্ভব। সমস্যাটি হ'ল আপনি কতটি উক্তি পড়েছেন তা নির্ধারণ করতে হবে এবং যদি কোনও কমাটি মানের দ্বিগুণ উদ্ধৃত মোডের ভিতরে বা বাইরে থাকে। বন্ধনী সামঞ্জস্য করা একটি অসম্ভব রিজেক্স সমস্যা। কিছু বর্ধিত নিয়মিত এক্সপ্রেশন ইঞ্জিন (পিসিআরই) এর সাথে ডিল করতে পারে তবে এটি কোনও নিয়মিত প্রকাশ নয়।

আপনি /programming/8629763/csv-parsing-with-a-context-free-grammar দরকারী খুঁজে পেতে পারেন ।


সংশোধিত:

আমি পালানোর চরিত্রগুলির জন্য ফর্ম্যাটগুলি খুঁজছি এবং স্বেচ্ছাসেবী গণনার প্রয়োজনের কোনও খুঁজে পাই নি - তাই সম্ভবত এটি সমস্যা নয়।

যাইহোক, পালানোর চরিত্র এবং রেকর্ড ডিলিমিটার কী (তা দিয়ে শুরু করতে হবে) তা নিয়ে সমস্যা রয়েছে। http://www.csvreader.com/csv_format.php বন্যের বিভিন্ন ফর্ম্যাটে ভাল পঠিত।

  • উদ্ধৃত স্ট্রিংয়ের নিয়ম (এটি যদি একক উদ্ধৃত স্ট্রিং বা ডাবল উদ্ধৃত স্ট্রিং হয়) পৃথক।
    • 'This, is a value' বনাম "This, is a value"
  • পালানোর অক্ষরের নিয়ম
    • "This ""is a value""" বনাম "This \"is a value\""
  • এম্বেড করা রেকর্ড ডিলিমিটারের হ্যান্ডলিং ({আরডি})
    • (কাঁচা এম্বেড) "This {rd}is a value"বনাম (পালানো) "This \{rd}is a value"বনাম (অনুবাদ)"This {0x1C}is a value"

এখানে মূল বিষয়টি হ'ল এটির স্ট্রিং থাকা সম্ভব যা সর্বদা একাধিক বৈধ ব্যাখ্যা করে।

সম্পর্কিত প্রশ্ন (প্রান্তের ক্ষেত্রে) "এটি কি একটি অবৈধ স্ট্রিং গ্রহণ করা সম্ভব?"

আমি এখনও দৃ strongly়ভাবে সন্দেহ করি যে এখানে একটি নিয়মিত প্রকাশ রয়েছে যা কিছু প্রয়োগ দ্বারা তৈরি করা প্রতিটি বৈধ সিএসভি সাথে মেলে এবং পার্স করা যায় না এমন প্রতিটি সিএসভি প্রত্যাখ্যান করে।


1
উদ্ধৃতিগুলির মধ্যে উদ্ধৃতিগুলি ভারসাম্যপূর্ণ হওয়া দরকার না। পরিবর্তে, সেখানে একটি এমবেডেড কোট, যা স্পষ্টত নিয়মিত করার আগে কোট একটি এমনকি সংখ্যা হতে হবে: ("")*"। কোট যদি ভিতরে মান ভারসাম্য বন্ধ, এটি আগে থেকেই আমাদের ব্যবসা নয়।
9000

এটি আমার অবস্থান, অতীতে "ডেটা স্থানান্তর" এর জন্য এই ভয়াবহ অজুহাত দেখানো। কেবলমাত্র যে জিনিসগুলি তাদের সঠিকভাবে পরিচালনা করেছিল তা হ'ল পার্সার, খাঁটি রেজেক্স প্রতি কয়েক সপ্তাহে বিরতি।
স্পেনসার রথবুন

2

প্রথমে আপনার সিএসভি-এর জন্য ব্যাকরণটি সংজ্ঞায়িত করুন (ক্ষেত্রের সীমানা পাঠকরা যদি কোনওভাবে টেক্সটে উপস্থিত থাকে তবে তারা পালিয়ে যায় বা এনকোড করে থাকে?) এবং তারপরে এটি রেগেক্সের সাথে পার্সেবল কিনা তা নির্ধারণ করা যেতে পারে। ব্যাকরণ প্রথম: পার্সার সেকেন্ড: http://www.boyet.com/articles/csvparser.html এটি লক্ষ করা উচিত যে এই পদ্ধতিতে একটি টোকেনাইজার ব্যবহার করা হয়েছে - তবে আমি কোনও পজিক্স রেজেক্স গঠন করতে পারি না যা সমস্ত প্রান্তের কেসের সাথে মিলে যায়। যদি আপনার সিএসভি ফর্ম্যাটগুলির ব্যবহার অ-নিয়মিত এবং প্রসঙ্গমুক্ত হয় ... তবে আপনার উত্তরটি আপনার প্রশ্নের মধ্যে রয়েছে। এখানে ভাল ওভারভিউ: http://nikic.github.com/2012/06/15/The-true-power-of-regular-expressions.html


2

আরএফসিএফ বর্ণিত হিসাবে এই রিজ এক্সপ্যাক্ট সাধারণ সিএসভি টোকানাইজ করতে পারে:

/("(?:[^"]|"")*"|[^,"\n\r]*)(,|\r?\n|\r)/

ব্যাখ্যা:

  • ("(?:[^"]|"")*"|[^,"\n\r]*) - একটি সিএসভি ক্ষেত্র, উদ্ধৃত বা না
    • "(?:[^"]|"")*" - একটি উদ্ধৃত ক্ষেত্র;
      • [^"]|""- প্রতিটি চরিত্র হয় হয় না ", বা "হিসাবে পালানো""
    • [^,"\n\r]* - একটি অব্যক্ত ক্ষেত্র, যাতে এটি নাও থাকতে পারে , " \n \r
  • (,|\r?\n|\r)- নিম্নলিখিত বিভাজক, হয় ,বা একটি নতুন লাইন
    • \r?\n|\r - একটি নতুন লাইন, একটি \r\n \n \r

একটি সম্পূর্ণ সিএসভি ফাইল বারবার এই রেজিএক্সপ্যাক্সের সাথে মেলানো এবং যাচাই করা যেতে পারে। এরপরে উদ্ধৃত ক্ষেত্রগুলি ঠিক করা এবং পৃথককারীগুলির উপর ভিত্তি করে সারিগুলিতে বিভক্ত করা প্রয়োজন।

জাভাস্ক্রিপ্টে সিএসভি পার্সারের জন্য কোডটি এখানে দেওয়া হয়েছে, রেজিএক্সপেক্সের উপর ভিত্তি করে:

var csv_tokens_rx = /("(?:[^"]|"")*"|[^,"\n\r]*)(,|\r?\n|\r)/y;
var csv_unescape_quote_rx = /""/g;
function csv_parse(s) {
    if (s && s.slice(-1) != '\n')
        s += '\n';
    var ok;
    var rows = [];
    var row = [];
    csv_tokens_rx.lastIndex = 0;
    while (true) {
        ok = csv_tokens_rx.lastIndex == s.length;
        var m = s.match(csv_tokens_rx);
        if (!m)
            break;
        var v = m[1], d = m[2];
        if (v[0] == '"') {
            v = v.slice(1, -1);
            v = v.replace(csv_unescape_quote_rx, '"');
        }
        if (d == ',' || v)
            row.push(v);
        if (d != ',') {
            rows.push(row)
            row = [];
        }
    }
    return ok ? rows : null;
}

এই উত্তরটি আপনার যুক্তি নিষ্পত্তি করতে সহায়তা করে কিনা তা আপনার সিদ্ধান্তের জন্য; আমি একটি ছোট, সাধারণ এবং সঠিক সিএসভি পার্সার পেয়ে খুশি।

আমার মতে একটি lexপ্রোগ্রাম কম বেশি একটি বৃহত্তর নিয়মিত প্রকাশ হয় এবং সেগুলি সি প্রোগ্রামিং ভাষার মতো আরও জটিল ফর্ম্যাটগুলিকে টোকনাইজ করতে পারে।

আরএফসি 4180 সংজ্ঞা সম্পর্কিত রেফারেন্স সহ :

  1. লাইন ব্রেক (সিআরএলএফ) - রেজিএক্সএক্স আরও নমনীয়, সিআরএলএফ, এলএফ বা সিআরকে অনুমতি দেয়।
  2. ফাইলের সর্বশেষ রেকর্ডটির একটি শেষ পংক্তি বিরতি থাকতে পারে বা নাও থাকতে পারে - এটি একটি চূড়ান্ত লাইন বিরতি হিসাবে regexp প্রয়োজন, তবে পার্সার তার জন্য সামঞ্জস্য করে।
  3. সেখানে একটি alচ্ছিক শিরোনাম রেখা থাকতে পারে - এটি পার্সারকে প্রভাবিত করে না।
  4. প্রতিটি লাইনে ফাইল জুড়ে একই সংখ্যক ক্ষেত্র থাকা উচিত - প্রয়োগ করা হয়নি এমন
    স্থানগুলি একটি ক্ষেত্রের অংশ হিসাবে বিবেচিত হয় এবং এড়িয়ে যাওয়া উচিত নয় - ঠিক আছে
    রেকর্ডের শেষ ক্ষেত্রটি অবশ্যই কমা দ্বারা অনুসরণ করা উচিত নয় - প্রয়োগ করা হয়নি
  5. প্রতিটি ক্ষেত্র ডাবল উদ্ধৃতিতে আবদ্ধ বা নাও হতে পারে ... - ঠিক আছে
  6. লাইন ব্রেক (সিআরএলএফ), ডাবল উদ্ধৃতি এবং কমাগুলি সহ ক্ষেত্রগুলিকে ডাবল-কোটে আবদ্ধ করা উচিত - ঠিক আছে
  7. একটি ক্ষেত্রের ভিতরে উপস্থিত একটি দ্বৈত-উদ্ধৃতি অবশ্যই এর আগে অন্য ডাবল উদ্ধৃতি দিয়ে পালাতে হবে - ঠিক আছে

রিজেক্সেপ নিজেই বেশিরভাগ আরএফসি 4180 প্রয়োজনীয়তা পূরণ করে। আমি অন্যদের সাথে একমত নই, তবে এগুলি কার্যকর করতে পার্সার সামঞ্জস্য করা সহজ।


1
এটিকে জিজ্ঞাসা করা প্রশ্নের সমাধানের চেয়ে স্ব-প্রচারের মতো দেখায়, কীভাবে উত্তর দেওয়া যায় দেখুন
gnat

1
@ জাগ্রত, আমি আরও ব্যাখ্যা দেওয়ার জন্য, আরএফসি 4180 এর বিপরীতে রেজিএক্সপ্যাকটি পরীক্ষা করতে এবং এটির স্ব-প্রচার প্রচার করার জন্য আমার উত্তর সম্পাদনা করেছি। আমি বিশ্বাস করি যে এই উত্তরের মান রয়েছে কারণ এটিতে একটি পরীক্ষিত রেজিপ্সপ রয়েছে যা এক্সেল এবং অন্যান্য স্প্রেডশিট দ্বারা ব্যবহৃত সিএসভির সর্বাধিক সাধারণ রূপকে টোকনাইজ করতে পারে। আমি মনে করি এটি প্রশ্ন নিষ্পত্তি করে। ছোট্ট CSV পার্সার দেখায় যে এই রিজেক্সট ব্যবহার করে সিএসভি পার্স করা সহজ।
স্যাম ওয়াটকিন্স

অতিরিক্ত মাত্রায় নিজেকে প্রচার করার ইচ্ছা না করে, এখানে আমার সম্পূর্ণ ছোট সিএসভি এবং টিএসভি লাইব্রেরি রয়েছে যা আমি সামান্য স্প্রেডশিট অ্যাপের অংশ হিসাবে ব্যবহার করছি (গুগল শিটগুলি আমার পক্ষে খুব ভারী বোধ করে)। এটি আমি প্রকাশিত সমস্ত স্টপের মতো ওপেন সোর্স / পাবলিক ডোমেন / সিসি কোড। আমি আশা করি এটি অন্য কারও পক্ষে কার্যকর হতে পারে। sam.aiki.info/code/js
স্যাম ওয়াটকিন্স
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.