2012-01-03 14 views
8

मुझे दो अलग-अलग फ़ाइलों को संयोजित करके कुछ डेटा संसाधित करना होगा। उनमें से दोनों में दो कॉलम हैं जो एक प्राथमिक कुंजी बनेंगे जिसका उपयोग मैं उन्हें एक-दूसरे से मिलान करने के लिए कर सकता हूं। प्रश्नों में फाइलें बड़ी हैं (लगभग 20 जीबी 20 मिलियन पंक्तियों के साथ) इसलिए मुझे एक कुशल कोड की आवश्यकता होगी। मैं पर्ल में यह कैसे करूँगा?एसक्यूएल जैसी कैसे करें पर्ल में शामिल हों?

मैं एक उदाहरण देता हूँ: फ़ाइल एक कॉलम

शामिल

तो

id, name, lastname, dob, school 

फ़ाइल बी स्तंभों

शामिल
address, id, postcode, dob, email 

मैं आईडी मिलान करते हुए इन दोनों फ़ाइलों में शामिल होने की आवश्यकता होगी और dob दो फ़ाइलों में एक आउटपुट फ़ाइल है जिसमें कॉलम होंगे:

id, name, lastname, dob, school, address, postcode, email 
+1

आप कितना रैम की क्या ज़रूरत है की कोशिश कर सकते हैं? –

उत्तर

8

सोचें कि मैं सिर्फ एक नया mysql/sqlite/जो भी डीबी और पंक्तियों को सम्मिलित करता हूं। पर्ल की ~ 20 लाइनें होनी चाहिए।

यह, ज़ाहिर है, .. एक डीबी तक आसानी से पहुँचा आवश्यकता

आप भी दिलचस्प क्षेत्रों से फ़ाइलों को क्रमबद्ध और फिर file1 में प्रत्येक पंक्ति के लिए खोजने के लिए और करें 2 में मेल खाती पंक्तियाँ प्रिंट कर सकता लगता।

+1

अधिकांश वितरण में SQLite मॉड्यूल है .. – shaun5

+2

...और आप सीधे सीपीएएन (डीबीडी :: SQLite) से SQLite की एक प्रति बना सकते हैं। SQLite में बहुत सारे डेटा डालने पर, बड़े लेनदेन का उपयोग करने के लिए इसे एक बिंदु बनाओ। – tsee

0

या, इस अच्छा Techrepublic आलेख को देखें - आप अभी भी 5 जी स्मृति की आवश्यकता के लिए उत्तरदायी हैं। मुझे आश्चर्य है कि यूनिक्स/लिनक्स सीएलआई सॉर्ट/यूटिलिटीज में शामिल होने पर आपको दक्षता के साथ ले जाएगा। सिर्फ एक विचार।

2

ऐसा करने का पुराना तरीका है कि दोनों फाइलों को कुंजी अनुक्रम में सॉर्ट करने के लिए सिस्टम उपयोगिताओं का उपयोग करना है और फिर लाइन से लाइन से मिलान करना है। दोनों चाबियाँ पढ़ें, यदि कुंजी डेटा आउटपुट से मेल खाते हैं। यदि वे मेल नहीं खाते हैं, तो फ़ाइल को तब तक कम कुंजी के साथ पढ़ें जब तक कि वे मेल न करें। यदि यह eof हिट करता है तो फ़ाइल के लिए कुंजी असीमित उच्च सेट करें। जब दोनों चाबियां असीम रूप से ऊंची होती हैं, तो आप कर लेंगे।

+0

सिस्टम उपयोगिता 'जॉइन' आपके इनपुट में सॉर्ट होने पर भी आपके लिए शामिल होगी। – reinierpost

+0

बहुत बढ़िया, उसे नहीं पता था। धन्यवाद। –

0

मैं वास्तव में इस की कोशिश की है नहीं है, लेकिन एक और अधिक रचनात्मक समाधान हो सकता है:

  1. एक बार प्रत्येक फ़ाइल पढ़ें और विशिष्ट आईडी + जन्म तिथि संयोजन और फाइल में अपनी स्थिति को जो नक्शा बना। tell() का प्रयोग करें।
  2. पर्ल
  3. में नक्शा बनाएं पदों का उपयोग करके फ़ाइलें से वास्तविक डेटा पढ़ें int वह नक्शा और sysread()
  4. एक नई फ़ाइल
0

तुम भी मेरी 3 साल का उपयोग कर सकते करने के लिए डेटा लिखें -old CPAN मॉड्यूल सेट :: रिलेशन जो इस तरह की चीजों को करने के लिए डिज़ाइन किया गया है, आपको पर्ल में शामिल होने जैसी सभी SQL सुविधाएं करने देता है। प्रत्येक फ़ाइल के लिए एक सेट :: रिलेशन ऑब्जेक्ट बनाएं और फिर जॉइन() विधि का उपयोग करें। उस ने कहा, इस मॉड्यूल के रूप में लागू आपके सभी ऑपरेटरों को बनाए रखेगा और परिणामस्वरूप स्मृति में होगा, इसलिए यह आपकी रैम से सीमित है। लेकिन आप अभी भी इसके स्रोत को देख सकते हैं कि कैसे() काम करता है और उसके आधार पर आपके उद्देश्यों के लिए एक और अधिक कुशल संस्करण लागू करता है।

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