2010-08-10 16 views
6

से असंगत रूप से स्वरूपित दिनांक निकालें मेरे पास फाइलों की एक बड़ी सूची है, जिनमें से कुछ फ़ाइल नाम में एम्बेडेड तिथियां हैं। तिथियों का प्रारूप असंगत और अक्सर अपूर्ण है, उदा। "Aug06", "अगस्त 2006", "अगस्त 2006", "08-06", "01-08-06", "2006", "011004" इत्यादि। इसके अतिरिक्त, कुछ फ़ाइल नामों में असंबद्ध संख्याएं होती हैं जो कुछ हद तक दिखती हैं तिथियां, उदाहरण के लिए "20202010"।स्ट्रिंग (दिनांक पार्सिंग, एनएलपी)

संक्षेप में, दिनांक सामान्य रूप से अधूरे हैं, कभी कभी नहीं, असंगत फ़ॉर्मेट किए गए हैं और अन्य जानकारी, उदा एक स्ट्रिंग में एम्बेडेड रहे हैं "Aug06.xls की रिपोर्ट करें"।

वहाँ किसी भी पर्ल मॉड्यूल उपलब्ध है जो इस तरह के एक स्ट्रिंग से तारीख अनुमान लगा की एक सभ्य काम करेगा कर रहे हैं? यह 100% सही होने के लिए के रूप में यह एक मानव मैन्युअल रूप से सत्यापित हो जाएगा नहीं है, लेकिन मैं उस व्यक्ति के लिए संभव के रूप में आसान के रूप में चीजों को बनाने के लिए कोशिश कर रहा हूँ और प्रविष्टियों के हजारों की जाँच करने के :)

उत्तर

3

दिनांक पार्स :: निश्चित रूप से आपका जवाब का हिस्सा बनने जा रहा है।

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

अपने नमूना डेटा का अधिक देखकर बिना, यह वास्तव में केवल अनुमान लगा सकता है, लेकिन मैं संभव या होने की संभावना "तिथि अनुभाग" उम्मीदवारों की पहचान करके शुरू कर दूं।

दिनांक :: पारसे का उपयोग करके एक बुरा क्रूर बल उदाहरण है (एक स्मार्ट दृष्टिकोण रेगेक्स-एन की सूची का उपयोग करेगा, दिनांक-बिट्स को आजमाने और पहचानने के लिए - मुझे सीपीयू चक्रों को जलाकर बहुत मुश्किल नहीं लगता है हालांकि!)

!/usr/bin/perl 
use strict; 
use warnings; 
use Date::Parse; 

my @files=("Report Aug06.xls", "ReportAug2006", "Report 11th September 2006.xls", 
      "Annual Report-08-06", "End-of-month Report01-08-06.xls", "Report2006"); 

# assumption - longest likely date string is something like '11th September 2006' - 19 chars 
# shortest is "2006" - 4 chars. 
# brute force all strings from 19-4 chars long at the end of the filename (less extension) 
# return the longest thing that Date::Parse recognises as a date 



foreach my $file (@files){ 
    #chop extension if there is one 
    $file=~s/\..*//; 
    for my $len (-19..-4){ 
    my $string = substr($file, $len); 
    my $time = str2time($string); 
    print "$string is a date: $time = ",scalar(localtime($time)),"\n" if $time; 
    last if $time; 
    } 
    } 
+0

यह कुछ हद तक समान है कि मैंने इसे अंत में कैसे किया, लेकिन मेरा बहुत लंबा, उग्र और डरावना है :) अगर मैं पहले समस्या से पहले किसी के सामने आ गया हूं, तो मैं इस प्रश्न को खुला छोड़ दूंगा, लेकिन ऐसा लगता है एक रोल की तरह अपनी खुद की समाधान चीज की तरह ... –

+0

आपका जवाब अनिवार्य रूप से सही है; ऐसा करने के लिए कोई पुस्तकालय नहीं दिखता है, आपको इसे स्वयं करना है :) –

0

देखते हैं Date::Parse जो आप चाहते हैं वह करता है। बिट है कि एक बेतरतीब ढंग से स्वरूपित तारीख की तरह स्ट्रिंग बाहर काम करता है और इसे से बाहर एक वास्तविक useable तारीख बनाना -

+0

दिनांक :: पार्स स्ट्रिंग में अन्य सभी जंक को अच्छी तरह से संभाल नहीं पाता है, इसलिए मेरे पास इसका उपयोग करके 100% अपरिभाषित दर है; मुझे क्रूड को अनदेखा करने और तारीख खोजने के लिए पर्याप्त कुछ चालाक चाहिए। यह तारीख के रूप में उतनी ही प्राकृतिक भाषा प्रसंस्करण है, मुझे लगता है। –

0

DateTime::Format::Natural इस काम के लिए एक उम्मीदवार की तरह लग रहा है। मैं इसे व्यक्तिगत रूप से नहीं देख सकता लेकिन इसमें good reviews है।

+0

मैं इसे पूरा कर चुका हूं, लेकिन दिनांक :: पार्स, दिनांक :: मणिप एट अल की तरह ऐसा लगता है कि सभी डेटा स्ट्रिंग तिथि के लिए प्रासंगिक है, जबकि मेरे तारों की अधिकांश सामग्री सिर्फ शोर (फ़ाइल नाम के अन्य भाग) हैं। –

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