কোনও ফাইল পার্স করার সর্বোত্তম উপায়


9

: আমি যেমন সেখানে আউট বিখ্যাত ফাইল ফরম্যাট কিছু করার জন্য একটি পার্সার তৈরীর জন্য একটি ভাল সমাধান খুঁজে বের করার চেষ্টা করছি EDIFACT এবং TRADACOMS

আপনি যদি এই মানগুলির সাথে পরিচিত না হন তবে উইকিপিডিয়া থেকে এই উদাহরণটি দেখুন:

কোনও পণ্য উপলভ্যতার অনুরোধের জবাব দিতে ব্যবহৃত কোনও সম্পাদনা বার্তার উদাহরণের জন্য নীচে দেখুন: -

UNA:+.? '
UNB+IATB:1+6XPPC+LHPPC+940101:0950+1'
UNH+1+PAORES:93:1:IA'
MSG+1:45'
IFT+3+XYZCOMPANY AVAILABILITY'
ERC+A7V:1:AMD'
IFT+3+NO MORE FLIGHTS'
ODI'
TVL+240493:1000::1220+FRA+JFK+DL+400+C'
PDI++C:3+Y::3+F::1'
APD+714C:0:::6++++++6X'
TVL+240493:1740::2030+JFK+MIA+DL+081+C'
PDI++C:4'
APD+EM2:0:130::6+++++++DA'
UNT+13+1'
UNZ+1+1'

ইউএনএ বিভাগটি alচ্ছিক। উপস্থিত থাকলে, এটি সেই বিশেষ চরিত্রগুলি নির্দিষ্ট করে যা মেসেজটির অবশিষ্ট অংশটি ব্যাখ্যা করতে ব্যবহৃত হবে। এই ক্রমে ইউএনএ অনুসারে ছয়টি অক্ষর রয়েছে:

  • উপাদান ডেটা উপাদান বিভাজক (: এই নমুনায়)
  • ডেটা উপাদান বিভাজক (+ এই নমুনায়)
  • দশমিক বিজ্ঞপ্তি (এই নমুনায়)
  • প্রকাশের অক্ষর (? এই নমুনায়)
  • সংরক্ষিত, অবশ্যই একটি স্থান হবে
  • বিভাগ টার্মিনেটর ('এই নমুনায়)

আপনি দেখতে পাচ্ছেন যে এটি বিশ্লেষণের জন্য অপেক্ষা করে একটি বিশেষ উপায়ে কিছু ডেটা ফর্ম্যাট করা হয়েছে (অনেকটা এক্সএমএল ফাইলের মতো )।

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

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

আমি এখনই নিয়মিত প্রকাশের দুঃস্বপ্নটি কল্পনা করতে পারি। এছাড়াও প্রতিটি সরবরাহকারীকে নিয়মিত প্রকাশে অনেকগুলি পরিবর্তন প্রয়োজন যা আমি প্রতিটি সরবরাহকারীর জন্য পার্সার তৈরির প্রবণতা রাখি।


প্রশ্নাবলী:

1- ফাইলগুলি পার্স করার জন্য এটি কি সেরা অনুশীলন (নিয়মিত এক্সপ্রেশন ব্যবহার করে)?

2- ফাইলগুলি পার্সিংয়ের জন্য আরও ভাল সমাধান আছে (সম্ভবত সেখানে প্রস্তুত সমাধান রয়েছে)? এটি ফাইলটি ক্ষতিগ্রস্থ হলে কোন বিভাগটি অনুপস্থিত তা দেখাতে সক্ষম হবে?

3- যদি যাইহোক আমার পার্সার তৈরি করতে হয় তবে আমার কোন নকশার প্যাটার্ন বা পদ্ধতি ব্যবহার করা উচিত?

মন্তব্য:

আমি ইয়্যাক এবং এএনটিএলআর সম্পর্কে কোথাও পড়েছি, তবে তারা আমার প্রয়োজনের সাথে মেলে কিনা জানি না!


এই EDIFACT ব্যাকরণ, পার্সার এবং লাইব্রেরি (জাভা) দেখার পরে আমি ভাবছি কোনও লেসার / পার্সার ব্যবহার করা কার্যকর হবে কিনা। এটি যদি আমি হয় তবে আমি প্রথমে পার্সার কম্বিনেটরটি চেষ্টা করব। :)
গাই কোডার

উত্তর:


18

আপনার যা প্রয়োজন তা সত্য পার্সার। নিয়মিত এক্সপ্রেশন পার্সিং নয়, লেক্সিং পরিচালনা করে। অর্থাৎ, তারা আপনার ইনপুট স্ট্রিমের মধ্যে টোকেনগুলি সনাক্ত করে। পার্সিং হ'ল টোকেনগুলির প্রসঙ্গ, IE কোথায় এবং কী ক্রমে যায়।

ক্লাসিক পার্সিং সরঞ্জামটি হ'ল ইয়্যাক / বাইসন । ক্লাসিক লেক্সারটি লেক্স / ফ্লেক্স । যেহেতু পিএইচপি সি কোডটি সংহত করার অনুমতি দেয় , আপনি আপনার পার্সার তৈরি করতে ফ্লেক্স এবং বাইসন ব্যবহার করতে পারেন, পিএইচপি কল করে ইনপুট ফাইল / স্ট্রিমে কল করতে পারেন এবং তারপরে আপনার ফলাফলগুলি পেতে পারেন।

একবারে সরঞ্জামগুলি বুঝতে পারলে এটি দ্রুত জ্বলবে এবং এর সাথে কাজ করা আরও সহজ । আমি লেক্স এবং ইয়্যাক ২ য় এড পড়ার পরামর্শ দিই ও'রিলি থেকে উদাহরণস্বরূপ, আমি গিথুবে একটি মেকফিল দিয়ে একটি ফ্লেক্স এবং বাইসন প্রকল্প স্থাপন করেছি । এটি প্রয়োজনীয় হলে উইন্ডোগুলির জন্য ক্রস সংকলনযোগ্য।

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


1
+1 দুর্দান্ত উত্তর, বিশেষত বিবেচনা করে যে এটি একটি নমুনা পার্সার নিয়ে আসে।
কালেব

@ কালেব ধন্যবাদ, আমি অনেকটা ফ্লেক্স / বাইসন নিয়ে কাজ করি, তবে খুব কম শালীন (পড়ুন: জটিল) উদাহরণ রয়েছে। এটি এখনকার সেরা পার্সার নয়, যেহেতু অনেক মন্তব্য নেই, তাই আপডেটগুলি প্রেরণে নির্দ্বিধায়।
স্পেন্সার রথবুন

@ স্পেন্সাররাথবুন আপনার বিস্তারিত উত্তর এবং উদাহরণের জন্য আপনাকে অনেক ধন্যবাদ। আপনি যে কোনও পরিভাষা উল্লেখ করেছেন (ইয়্যাক / বাইসন, লেক্স / ফ্লেক্স, ... ইত্যাদি) সম্পর্কে এখনও আমার কোন জ্ঞান নেই কারণ আমার অভিজ্ঞতাটি মূলত ওয়েব বিকাশ সম্পর্কে। Is "লেক্স এবং Yacc 2nd এড" আমাকে সবকিছু বোঝেন এবং একটি ভাল পার্সার গড়ে তুলতে জন্য যথেষ্ট? বা এমন অন্যান্য বিষয় এবং উপকরণ রয়েছে যা আমার প্রথমে coverাকা উচিত?
স্যাঙ্গো

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

আমি মনে করি না যে কোনও স্ট্যান্ডার্ড লেক্সার গতিশীল বিভাজককে পরিচালনা করতে পারে, যা ইউএনএ লাইনটি নির্দিষ্ট করতে পারে। সুতরাং কমপক্ষে আপনার 5 টি বিভাজনের জন্য রানটাইম-কাস্টমাইজযোগ্য অক্ষর সহ একটি লেক্সারের প্রয়োজন।
কেভিন 14

3

আচ্ছা .. 'সত্য' পার্সার? রাষ্ট্রের যন্ত্রগুলি ??

দুঃখিত তবে আমি আমার কর্মসংস্থান শুরুর পর থেকে আমি একাডেমিক থেকে হ্যাকারে রূপান্তরিত হয়েছি .. তাই আমি বলব এর আরও সহজ উপায় আছে .. যদিও সম্ভবত একাডেমিকভাবে 'পরিশোধিত' হিসাবে নয় :)

আমি একটি বিকল্প পদ্ধতির প্রস্তাব দেওয়ার চেষ্টা করব যার সাথে কেউ কেউ একমত হতেও পারে বা নাও পারে তবে এটি কোনও কাজের পরিবেশে খুব ব্যবহারিক হতে পারে।

আমি করতাম;

loop every line
   X = pop the first 3 letters of line
   Y = rest of line
   case X = 'UNA':
       class init (Y)

সেখান থেকে আমি ডেটা ধরণের জন্য ক্লাস ব্যবহার করব। বিভাজক উপাদান এবং উপাদান বিভাজক এবং ফিরে অ্যারে পুনরাবৃত্তি।

আমার জন্য, এটি কোড পুনরায় ব্যবহার, ওও, কম সংহতি এবং অত্যন্ত মডুলার .. এবং ডিবাগ করা এবং প্রোগ্রাম করা সহজ। সহজ আরও ভাল।

কোনও ফাইলকে বিশ্লেষণের জন্য আপনার কোনও রাষ্ট্রীয় মেশিন বা সম্পূর্ণ জটিল কিছু প্রয়োজন নেই .. রাষ্ট্র যন্ত্রগুলি পার্স কোডের পক্ষে উপযুক্ত suited

পুনশ্চ. আমি এর আগে খুব অনুরূপ ফাইলগুলির সাথে কাজ করেছি :)


আরও সিউডো কোড এখানে পোস্ট করা:

শ্রেণী

UNA:

init(Y):
 remove ' from end
 components = Y.split(':') 
 for c in components
     .. etc..

 getComponents():
   logic..
   return

 getSomethingElse():
   logic..
   return

class UNZ:
   ...

Parser(lines):

Msg = new obj;

for line in lines
   X = pop the first 3 letters of line
   Y = rest of line
   case X = 'UNA':
      Msg.add(UNA(Y))

msg.isOK = true
return Msg

আপনি তখন এটি ব্যবহার করতে পারেন ..

msg = Main(File.getLines());
// could put in error checking
// if msg.isOK:
msg.UNA.getSomethingElse();

এবং বলুন যে আপনার একাধিক বিভাগ রয়েছে .. সেগুলি যুক্ত করতে একটি সারি ব্যবহার করুন এবং আপনার প্রয়োজনমতো প্রথম, দ্বিতীয় ইত্যাদি পান। আপনি সত্যিই কেবল কোনও আপত্তিতে চিত্রটির প্রতিনিধিত্ব করছেন এবং ডেটা কল করার জন্য অবজেক্টের পদ্ধতিগুলি দিচ্ছেন। উত্তরাধিকারের জন্যও কাস্টম পদ্ধতি তৈরি করে আপনি এর সদ্ব্যবহার করতে পারেন .. ঠিক এটি অন্যরকম প্রশ্ন এবং আমি মনে করি আপনি যদি এটি বুঝতে পারেন তবে আপনি সহজেই এটি প্রয়োগ করতে পারবেন


3
আমি এটি আগে করেছি, এবং খুঁজে পেয়েছি এটি এক বা দুটি ক্ষেত্রে অতিক্রম করে যে কোনও কিছুর জন্য অপর্যাপ্ত recognize X token and do Y। কোনও প্রসঙ্গ নেই, আপনার একাধিক রাজ্য থাকতে পারে না, একটি মামুলি সংখ্যার কেস পেরিয়ে কোডটি ফুলে যায় এবং ত্রুটি পরিচালনা করা কঠিন। আমি দেখতে পেয়েছি যে প্রায় সমস্ত ক্ষেত্রেই আমার বাস্তব বিশ্বে এই বৈশিষ্ট্যগুলির প্রয়োজন ছিল। জটিলতা বাড়ার সাথে সাথে এটি ভুলগুলিকে ফেলে দেয়। সবচেয়ে শক্ত অংশটি একটি কঙ্কাল স্থাপন করছে এবং কীভাবে সরঞ্জামটি পরিচালনা করে তা শিখছে। অতীত হয়ে যান এবং কোনও কিছু বেতনের পক্ষে ঠিক তত দ্রুত।
স্পেনসার রথবুন

এটি একটি বার্তা, আপনার কোন রাজ্যের দরকার? এটি দেখে মনে হবে যে এই জাতীয় বার্তা, যা সংমিশ্রণ এবং বিভাগগুলির কাঠামোয় সংগঠিত হয় এই ওও পদ্ধতির পুরোপুরি ফিট করে। ত্রুটি হ্যান্ডলিং প্রতি ক্লাসে করা হয় এবং সঠিকভাবে সম্পন্ন করা যায় আপনি এমন পার্সার তৈরি করতে পারেন যা খুব দক্ষ এবং এক্সটেনসিবল। এই বার্তাগুলি ক্লাস এবং ফাংশনগুলিতে নিজেকে ধার দেয় বিশেষত যখন একাধিক বিক্রেতারা একই বিন্যাসের বিভিন্ন স্বাদ পাঠায়। উদাহরণ হ'ল ইউএনএ শ্রেণিতে একটি ফাংশন যা নির্দিষ্ট বিক্রেতার জন্য একটি নির্দিষ্ট মান ফিরিয়ে দেয়।
রস 14

@Ross তাই মূলত আপনাকে একটি থাকবে "UNA শ্রেণী" অংশে অন্তর্ভুক্ত করার জন্য "UNA" (প্রতিটি বিক্রেতা জন্য একটি পার্স পদ্ধতি হতে পারে এবং এটা ভিতরে parseUNAsegemntForVendor1(), parseUNAsegemntForVendor2(), parseUNAsegemntForVendor3(), ... ইত্যাদি), ঠিক আছে?
সানগো

2
@ রোস বার্তাটির কয়েকটি বিভাগ রয়েছে, পার্সিংয়ের সময় বিভিন্ন পয়েন্টে বৈধ। সেই রাজ্যগুলির মধ্যে আমি বলছিলাম। ওও ডিজাইনটি চতুর, এবং আমি বলছি না এটি কাজ করবে না । আমি ফ্লেক্স এবং বাইসনকে ধাক্কা দিয়ে থাকি কারণ ফাংশনাল প্রোগ্রামিং কনসেপ্টগুলির মতো এগুলি অন্যান্য সরঞ্জামের তুলনায় আরও ভাল ফিট করে তবে বেশিরভাগ লোকেরা বিশ্বাস করেন যে তারা শিখনকে বিরক্ত করতে খুব জটিল।
স্পেনসার রথবুন

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

1

আপনি কি "পিএইচপি সম্পাদনা" জন্য গুগল করার চেষ্টা করেছেন? এটি পপ-আপ হওয়া প্রথম ফলাফলগুলির মধ্যে একটি: http://code.google.com/p/edieasy/

এটি আপনার ব্যবহারের ক্ষেত্রে যথেষ্ট না হলেও আপনি এটি থেকে কিছু ধারণা পেতে সক্ষম হতে পারেন। লুপ এবং শর্তের জন্য কোডটি অনেক নেস্টেড সহ আমি পছন্দ করি না তবে এটি শুরু হতে পারে।


1
আমি সেখানে অনেকগুলি প্রকল্প পরীক্ষা করে দেখেছি, তবে সমস্যাটি মূলত স্ট্যান্ডার্ডটি ব্যবহার করে বিক্রেতাদের বিভিন্ন বাস্তবায়নে ছিল। আমি একজন বিক্রেতাকে আমাকে একটি নির্দিষ্ট বিভাগ পাঠাতে বাধ্য করতে পারি, তবে আমি অন্য বিক্রেতার পক্ষে এটি alচ্ছিক বিবেচনা করতে পারি। এজন্য আমার সম্ভবত নিজের কাস্টমাইজড পার্সারটি যেভাবেই তৈরি করা দরকার।
স্যাঙ্গো

1

ঠিক যেহেতু ইয়্যাক / বাইসন + ফ্লেক্স / লেক্সের উল্লেখ করা হয়েছে, আমি পাশাপাশি অন্যান্য বড় বিকল্পগুলির মধ্যে একটিও ফেলে দিতে পারি: পার্সার কম্বিনেটরগুলি। এগুলি হ্যাস্কেলের মতো ফাংশনাল প্রোগ্রামিংয়ে জনপ্রিয়, তবে আপনি যদি সি কোডটিতে ইন্টারফেস করতে পারেন তবে আপনি সেগুলি ব্যবহার করতে পারেন এবং কী জানেন, কেউ পিএইচপি-র জন্যও একটি লিখেছিলেন। (এই বিশেষ প্রয়োগের সাথে আমার কোনও অভিজ্ঞতা নেই, তবে এটি যদি তাদের বেশিরভাগের মতো কাজ করে তবে এটি বেশ সুন্দর হওয়া উচিত))

সাধারণ ধারণাটি হল আপনি পার্সার সংজ্ঞায়িত করা সহজ, সাধারণত টোকেনাইজারগুলির একটি সেট দিয়ে শুরু করুন। আপনার উল্লিখিত data টি ডাটা উপাদানগুলির জন্য আপনার একটি পার্সার ফাংশন থাকতে হবে। তারপরে আপনি বৃহত্তর পার্সারগুলি তৈরি করতে বড় সমন্বয়কারীগুলি (ফাংশনগুলিকে সংযুক্ত করে ফাংশনগুলি) সংযুক্তকারীগুলি ব্যবহার করেন larger optionalAnচ্ছিক সেগমেন্টের মতো সেগমেন্ট পার্সারে অপারেটিং সংযোজক হবে ।

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


0

রেজেক্সগুলির সাথে ফিডিংয়ের পরিবর্তে আপনার নিজের রাষ্ট্রীয় মেশিন তৈরি করে

এটি অ-তুচ্ছ পরিস্থিতিতে আরও পাঠযোগ্য (এবং আরও ভাল মন্তব্য করতে সক্ষম হবেন) এবং ডিবাগ করা আরও সহজ হবে যে ব্ল্যাক বক্সটি রেজেেক্স


5
একটি দ্রষ্টব্য নোট, এটি হুডের নীচে ফ্লেক্স এবং বাইসন করে। কেবল তারা এটি সঠিকভাবে করেন
স্পেনসার রথবুন

0

আমি জানি না আপনি এই ডেটাটির পরে ঠিক কী করতে চান এবং এটি যদি বাদামের জন্য স্লেজহ্যামার না হয় তবে এলির সাথে আমার ভাল অভিজ্ঞতা ছিল । আপনি লেজিক্যাল বাক্যাংশগুলি বর্ণনা করেন এবং তারপরে কংক্রিট / বিমূর্ত বাক্য গঠন এবং যা উত্পন্ন করতে চান তা উত্পন্ন করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.