Jquery-csv প্লাগ- ইনতে ব্যবহৃত সিএসভি পার্সার
এটি একটি বেসিক চমস্কি টাইপ তৃতীয় ব্যাকরণ পার্সার।
একটি রেজেক্স টোকেনাইজার চার-বাই-চার ভিত্তিতে ডেটা মূল্যায়নের জন্য ব্যবহৃত হয়। যখন নিয়ন্ত্রণের মুখোমুখি হয়, তখন কোডটি আরম্ভের অবস্থার উপর ভিত্তি করে আরও মূল্যায়নের জন্য একটি স্যুইচ স্টেটমেন্টে প্রেরণ করা হয়। নন-নিয়ন্ত্রণের অক্ষরগুলি গোষ্ঠীভুক্ত করা হয়েছে এবং স্ট্রিং অনুলিপি অপারেশনগুলির সংখ্যা কমিয়ে আনার জন্য মাসিকে অনুলিপি করা হয়েছে।
টোকেনাইজার:
var tokenizer = /("|,|\n|\r|[^",\r\n]+)/;
ম্যাচের প্রথম সেটটি হ'ল কন্ট্রোল অক্ষর: মান ডিলিমিটার (") মান পৃথককারী (,) এবং এন্ট্রি বিভাজক (নতুন লাইনের সমস্ত প্রকরণ) The
এখানে 10 টি নিয়ম রয়েছে যা পার্সারকে অবশ্যই সন্তুষ্ট করতে হবে:
- নিয়ম # 1 - প্রতি লাইনে একটি করে প্রবেশ, প্রতিটি লাইন একটি নতুন লাইনের সাথে শেষ হয়
- বিধি # 2 - ফাইলের শেষে ট্রেলিং করা নতুন লাইন বাদ দেওয়া হয়েছে
- বিধি # 3 - প্রথম সারিতে শিরোনামের ডেটা রয়েছে
- নিয়ম # 4 - স্পেসগুলি ডেটা হিসাবে বিবেচিত হয় এবং এন্ট্রিগুলিতে একটি পিছনে কমা থাকা উচিত নয়
- নিয়ম # 5 - লাইনগুলি ডাবল-কোট দ্বারা সীমিত করা যেতে পারে বা নাও পারে
- বিধি # 6 - লাইন ব্রেক, ডাবল-কোটস এবং কমাগুলি সহ ক্ষেত্রগুলিকে ডাবল-কোটে আবদ্ধ করা উচিত
- নিয়ম # 7 - যদি ক্ষেত্রগুলি আবদ্ধ করতে ডাবল-কোট ব্যবহার করা হয়, তবে ক্ষেত্রের ভিতরে উপস্থিত একটি দ্বৈত উদ্ধৃতিটিকে অন্য একটি দ্বিগুণ উদ্ধৃতি দিয়ে পূর্ববর্তী করে পালাতে হবে
- সংশোধন # 1 - একটি অব্যক্ত ক্ষেত্র হতে পারে বা পারে
- সংশোধন # 2 - একটি উদ্ধৃত ক্ষেত্রটি নাও পারে
- সংশোধন # 3 - একটি এন্ট্রিতে সর্বশেষ ক্ষেত্রটি নাল মান বা নাও থাকতে পারে
দ্রষ্টব্য: শীর্ষ 7 টি নিয়ম সরাসরি আইইটিএফ আরএফসি 4180 থেকে প্রাপ্ত । সর্বশেষ 3 টি আধুনিক স্প্রেডশিট অ্যাপ্লিকেশন (প্রাক্তন এক্সেল, গুগল স্প্রেডশিট) দ্বারা প্রবর্তিত প্রান্ত কেসগুলিতে যুক্ত করা হয়েছিল যা ডিফল্টরূপে সমস্ত মান সীমাবদ্ধ করে না (অর্থাৎ উদ্ধৃতি) ote আমি আরএফসিতে পরিবর্তনগুলি ফিরিয়ে দেওয়ার চেষ্টা করেছি তবে এখনও আমার তদন্তের কোনও প্রতিক্রিয়া শুনতে পাইনি।
উইন্ড-আপ দিয়ে যথেষ্ট, এখানে চিত্রটি রয়েছে:
যুক্তরাষ্ট্র:
- একটি এন্ট্রি এবং / অথবা একটি মান জন্য প্রাথমিক অবস্থা
- একটি উদ্বোধনী উদ্ধৃতি সম্মুখীন হয়েছে
- একটি দ্বিতীয় উদ্ধৃতি সম্মুখীন হয়েছে
- একটি অ-উদ্ধৃত মান সম্মুখীন হয়েছে
স্থানান্তর:
- ক। উদ্ধৃত মান (1), অব্যক্ত মান (3), নাল মান (0), নাল এন্ট্রি (0) এবং নতুন এন্ট্রি (0) উভয়ের জন্য চেক
- খ। দ্বিতীয় উদ্ধৃতি চরের জন্য চেক (2)
- গ। একটি পালানো উদ্ধৃতি (1), মানের শেষে (0) এবং প্রবেশের সমাপ্তি (0)
- ঘ। মান (0) এর শেষে এবং প্রবেশের শেষ (0) পরীক্ষা করে
দ্রষ্টব্য: এটি আসলে একটি রাষ্ট্র অনুপস্থিত। 'সি' -> 'বি' থেকে '1' রাজ্যের সাথে চিহ্নিত একটি রেখা থাকা উচিত কারণ একজন পলায়িত দ্বিতীয় ডিলিমিটার মানে প্রথম ডিলিমিটারটি এখনও খোলা রয়েছে। প্রকৃতপক্ষে, সম্ভবত এটি অন্য রূপান্তর হিসাবে প্রতিনিধিত্ব করা ভাল। এগুলি তৈরি করা একটি শিল্প, কোনও সঠিক উপায় নেই।
দ্রষ্টব্য: এটি একটি প্রস্থান স্থিতিও হারিয়েছে তবে বৈধ ডেটা অনুসারে পার্সার সর্বদা রূপান্তর 'এ' এ শেষ হয় এবং রাজ্যগুলির কোনওটিই সম্ভব হয় না কারণ এখানে বিশ্লেষণের কিছুই নেই nothing
রাজ্য এবং স্থানান্তরের মধ্যে পার্থক্য:
একটি রাষ্ট্র সীমাবদ্ধ, যার অর্থ এটি কেবল একটি জিনিসকে বোঝাতেই অনুমান করা যায়।
একটি রূপান্তর রাষ্ট্রগুলির মধ্যে প্রবাহকে উপস্থাপন করে যাতে এর অর্থ অনেক কিছুই হতে পারে।
মূলত, রাষ্ট্র-> রূপান্তর সম্পর্কটি 1 -> * (অর্থাত্ এক-বহু)। রাষ্ট্র 'এটি কী' সংজ্ঞা দেয় এবং রূপান্তর 'এটি কীভাবে পরিচালিত হয়' সংজ্ঞা দেয়।
দ্রষ্টব্য: রাজ্যগুলির / সংক্রমণগুলির প্রয়োগ যদি স্বজ্ঞাত না অনুভব করে চিন্তিত হবেন না, এটি স্বজ্ঞাত নয়। অবশেষে ধারণাটি আঁকড়ে ধরার আগে আমার চেয়ে অনেক বেশি স্মার্ট কারও সাথে এটির জন্য কিছু বিস্তৃত লেগেছে।
সিউডো কোড:
csv = // csv input string
// init all state & data
state = 0
value = ""
entry = []
output = []
endOfValue() {
entry.push(value)
value = ""
}
endOfEntry() {
endOfValue()
output.push(entry)
entry = []
}
tokenizer = /("|,|\n|\r|[^",\r\n]+)/gm
// using the match extension of string.replace. string.exec can also be used in a similar manner
csv.replace(tokenizer, function (match) {
switch(state) {
case 0:
if(opening delimiter)
state = 1
break
if(new-line)
endOfEntry()
state = 0
break
if(un-delimited data)
value += match
state = 3
break
case 1:
if(second delimiter encountered)
state = 2
break
if(non-control char data)
value += match
state = 1
break
case 2:
if(escaped delimiter)
state = 1
break
if(separator)
endOfValue()
state = 0
break
if(newline)
endOfEntry()
state = 0
break
case 3:
if(separator)
endOfValue()
state = 0
break
if(newline)
endOfEntry()
state = 0
break
}
}
দ্রষ্টব্য: এটি আক্ষেপ, বাস্তবে আরও অনেক কিছু বিবেচনা করা উচিত। উদাহরণস্বরূপ, ত্রুটি পরীক্ষা করা, নাল মান, একটি অনুসরণকারী ফাঁকা রেখা (যার অর্থ বৈধ) ইত্যাদি
এই ক্ষেত্রে, যখন রাজেন ম্যাচ ব্লক একটি পুনরাবৃত্তি সমাপ্ত করে তখন রাষ্ট্রগুলি জিনিসগুলির শর্ত। স্থানান্তর কেস স্টেটমেন্ট হিসাবে প্রতিনিধিত্ব করা হয়।
মানুষ হিসাবে, আমাদের নিম্ন স্তরের অপারেশনগুলিকে উচ্চ স্তরের বিমূর্তে সরল করার প্রবণতা রয়েছে তবে এফএসএমের সাথে কাজ করে নিম্ন স্তরের অপারেশনগুলি নিয়ে কাজ করা হয়। যদিও রাজ্যগুলি এবং স্থানান্তরণগুলি পৃথকভাবে কাজ করা খুব সহজ তবে পুরো একবারে একবারে কল্পনা করা সহজাতভাবে কঠিন। ট্রানজিশনগুলি কীভাবে সঞ্চালিত হয় তা আবিষ্কার না করা অবধি কার্যকরভাবে পৃথক পৃথক পৃথক পথ অনুসরণ করা আমার পক্ষে পাওয়া যায়। এটি মৌলিক গণিত শেখার মতো রাজা, নিম্ন স্তরের বিবরণ স্বয়ংক্রিয় হওয়া শুরু না হওয়া পর্যন্ত আপনি কোনও উচ্চ স্তর থেকে কোডটি মূল্যায়ন করতে সক্ষম হবেন না।
পাশে: আপনি যদি বাস্তব বাস্তবায়নটি দেখেন তবে অনেকগুলি বিবরণ অনুপস্থিত। প্রথমত, সমস্ত অসম্ভব পাথ নির্দিষ্ট ব্যতিক্রম ছুঁড়ে দেবে। তাদের আঘাত করা অসম্ভব হওয়া উচিত তবে কোনও কিছু যদি ভেঙে যায় তবে তারা একেবারে পরীক্ষার রানার ব্যতিক্রমকে ট্রিগার করবে। দ্বিতীয়ত, 'আইনী' সিএসভি ডেটা স্ট্রিংয়ে যা অনুমোদিত তা পার্সার বিধিগুলি বেশ আলগা so তাই কোডটি প্রচুর নির্দিষ্ট প্রান্তের কেসগুলি পরিচালনা করার জন্য প্রয়োজনীয়। এই সত্য নির্বিশেষে, এই বাগ প্রক্রিয়াটি সমস্ত বাগ ফিক্স, এক্সটেনশন এবং সূক্ষ্ম সুরকরণের আগে এফএসএমকে উপহাস করার জন্য ব্যবহৃত হয়েছিল।
বেশিরভাগ ডিজাইনের মতো এটি বাস্তবায়নের নিখুঁত উপস্থাপনা নয় তবে এটি গুরুত্বপূর্ণ অংশগুলির রূপরেখা দেয়। অনুশীলনে, আসলে এই নকশাটি থেকে প্রাপ্ত 3 টি পৃথক পার্সার ফাংশন রয়েছে: একটি সিএসভি-নির্দিষ্ট লাইন স্প্লিটার, একটি একক-লাইন পার্সার এবং একটি সম্পূর্ণ মাল্টি-লাইন পার্সার। এগুলি সকলেই একইভাবে পরিচালিত হয়, তারা নিউলাইন চরগুলি যেভাবে পরিচালনা করে তার সাথে পৃথক হয়।