2009-08-07 16 views
5

मेरी कंपनी का एक ग्राहक है जो विभिन्न स्थानों पर विभिन्न कंपनियों के उत्पादों के लिए कीमतों को ट्रैक करता है। यह जानकारी डेटाबेस में जाती है।टेक्स्ट पढ़ने के लिए एल्गोरिदम या पैटर्न

ये कंपनियां प्रतिदिन हमारे ग्राहक को कीमतें ईमेल करती हैं, और निश्चित रूप से ईमेल सभी अलग-अलग स्वरूपित होते हैं। किसी भी कंपनी ने अपना प्रारूप बदलना असंभव है - वे ऐसा नहीं करेंगे।

कुछ इस तरह एक तरह से देखने के लिए:

 
    This is example text that could be many lines long... 

    Location 1 
    Product 1  Product 2  Product 3 
    $20.99  $21.99  $33.79 

    Location 2 
    Product 1  Product 2  Product 3 
    $24.99  $22.88  $35.59 

दूसरों इस तरह तरह की लग रही है:

 
    PRODUCT       PRICE   +/- 
    ------------  -------- ------- 
    Location 1 
    1             2007.30 +048.20 
    2             2022.50 +048.20 

    Maybe some multiline text here about a holiday or something... 

    Location 2 
    1             2017.30 +048.20 
    2             2032.50 +048.20 

वर्तमान में हम अलग-अलग प्रत्येक कंपनी की ईमेल प्रारूप के लिए लिखा पारसर्स है। लेकिन ये प्रारूप थोड़ा बार बदलते हैं। हम हर बार एक ही पंक्ति या कॉलम पर होने वाली कीमतों पर भरोसा नहीं कर सकते हैं।

हमारे लिए ईमेल देखने और यह निर्धारित करने के लिए कि कौन सा मूल्य किस स्थान पर जाता है, उस स्थान पर कौन सा मूल्य जाता है। लेकिन हमारे कोड के लिए इतना नहीं है। तो मैं एक और अधिक लचीला समाधान खोजने की कोशिश कर रहा हूं और आपके सुझावों के बारे में आपके सुझावों को पसंद करूंगा। मैं रेगेक्स से तंत्रिका नेटवर्क तक कुछ भी खोल रहा हूं - मैं सीखूंगा कि मुझे यह काम करने के लिए क्या चाहिए, मुझे नहीं पता कि मुझे क्या सीखना है। क्या यह एक लेक्स/पार्सिंग समस्या है? ओसीआर के समान ही?

कोड को प्रारूपों को स्वयं ही समझना नहीं है। ईमेल उपरोक्त लोगों की तरह कुछ मुख्य 'शैलियों' में आते हैं। हमें वास्तव में केवल इतना लचीला होने के लिए कोड की आवश्यकता है कि एक नई उत्पाद लाइन या व्हाइटस्पेस या कुछ फ़ाइल को अवांछित नहीं बनाता है।

कहां से शुरू करना है इसके बारे में किसी भी सुझाव के लिए धन्यवाद।

+1

यह देखना उपयोगी होगा कि आप अभी इन प्रारूपों में से किसी एक को कैसे पार्स कर रहे हैं। कोई भी आपके मौजूदा कोड को लेने में सक्षम हो सकता है और यह बता सकता है कि इसे और अधिक लचीला बनाया जा सकता है। –

+0

वर्तमान कोड मूल रूप से है: यदि कंपनी कंपनी 1 है, तो तीसरी पंक्ति पर जाएं, पहले 12 वर्णों को उत्पाद के रूप में पढ़ें, फिर मूल्य के रूप में 45-50 वर्ण पढ़ें। फिर चौथी पंक्ति पर जाएं ... यह बहुत कठिन कोड कोड है। –

+0

@ स्कॉट, ठीक है, अगर व्हाइटस्पेस डेटा को कॉलम में अलग कर रहा है जैसे कि मैं अपने उत्तर में वर्णन करता हूं, तो आप आसानी से स्क्रिप्टिंग का उपयोग कर सकते हैं। – nik

उत्तर

7

मुझे लगता है कि यह समस्या उचित पार्सर जनरेटर के लिए उपयुक्त होगी। यदि वे गलत हो जाते हैं तो नियमित अभिव्यक्तियों का परीक्षण और डीबग करना बहुत कठिन होता है। हालांकि, मैं एक पार्सर जनरेटर के लिए जाना चाहूंगा जो कि उपयोग करने में आसान है जैसे कि यह एक भाषा का हिस्सा था।

इस प्रकार के कार्यों के लिए मैं पाइपर्सिंग के साथ जाऊंगा क्योंकि इसे पूर्ण एलआर पार्सर की शक्ति मिली है, लेकिन बिना किसी कठोर व्याकरण के परिभाषित करने और बहुत अच्छे सहायक कार्यों के बिना। कोड भी पढ़ने के लिए आसान है।

from pyparsing import * 

aaa =""" This is example text that could be many lines long... 
      another line 

    Location 1 
    Product 1  Product 2  Product 3 
    $20.99  $21.99  $33.79 

    stuff in here you want to ignore 

    Location 2 
    Product 1  Product 2  Product 3 
    $24.99  $22.88  $35.59 """ 

result = SkipTo("Location").suppress() \ 
# in place of "location" could be any type of match like a re. 
     + OneOrMore(Word(alphas) + Word(nums)) \ 
     + OneOrMore(Word(nums+"$.")) \ 

all_results = OneOrMore(Group(result)) 

parsed = all_results.parseString(aaa) 

for block in parsed: 
    print block 

यह सूचियों की एक सूची देता है।

['Location', '1', 'Product', '1', 'Product', '2', 'Product', '3', '$20.99', '$21.99', '$33.79'] 
['Location', '2', 'Product', '1', 'Product', '2', 'Product', '3', '$24.99', '$22.88', '$35.59'] 

आप चीजों को समूहबद्ध कर सकते हैं जैसा कि आप चाहते हैं लेकिन सादगी के लिए मैंने अभी सूचियां वापस कर दी हैं। व्हाइटस्पेस को डिफ़ॉल्ट रूप से अनदेखा किया जाता है जो चीजों को बहुत आसान बनाता है।

मुझे नहीं पता कि अन्य भाषाओं में समकक्ष हैं या नहीं।

0

आपने टेक्स्ट फ़ाइलों के लिए दो पैटर्न नमूने दिए हैं।
मुझे लगता है कि इन्हें स्क्रिप्टिंग के साथ संभाला जा सकता है।
कुछ ऐसा: एडब्ल्यूके, sed, grep bash scripting के साथ। पहला नमूना में


एक पैटर्न,

  1. धारा Location [संख्या]
    • खंड की दूसरी पंक्ति कॉलम उत्पादों के नाम
    • खंड की तीसरी लाइन है का वर्णन किया गया है कीवर्ड के साथ शुरू होता उत्पादों के लिए कीमतों के साथ कॉलम

प्रति अनुभाग उत्पादों की परिवर्तनीय संख्या हो सकती है।
प्रति फ़ाइल अनुभागों की चर संख्या हो सकती है।
उत्पाद और कीमतें हमेशा एक खंड की उनकी निर्दिष्ट लाइनों पर होती हैं।
व्हाइटस्पेस अलगाव (product,price) कॉलम-एसोसिएशन की पहचान करता है।
किसी अनुभाग में उत्पादों की संख्या उस खंड में कीमतों की संख्या से मेल खाती है।


संग्रहित डेटा शायद डेटाबेस में समेकित हो जाएगा।

0

एक बात जो मुझे पता है मैं यहां उपयोग करता हूं नियमित अभिव्यक्ति है। तीन या चार अभिव्यक्ति प्रत्येक ई-मेल प्रारूप के लिए पार्स तर्क चला सकते हैं।

पार्स इंजन लिखने की कोशिश करने से अधिक आम तौर पर, मुझे लगता है कि, इसे ओवरप्रोग्रामिंग के किनारे पर स्कर्ट करना होगा।

+0

धन्यवाद। अभी हम खोज कर रहे हैं क्योंकि ऐसा हो सकता है कि अधिक सामान्य विधि राजस्व को तीन गुना कर सकती है, जो 'ओवरप्रोग्रामिंग' की हमारी सामान्य परिभाषा को बदलती है। :) यदि आपके पास अधिक सामान्य तरीकों के बारे में विचार हैं, भले ही वे ऐसा लगता है कि वे अधिक हो सकते हैं, तो कृपया उन्हें जोड़ें। –

संबंधित मुद्दे