2011-03-24 13 views
8

मैं PHP में दो सीएसवी फाइलों को गठबंधन करने की कोशिश कर रहा हूं। मैं सही विधि की तलाश में हूं। यहाँ मेरी कोड अब तक बताया गया है:2 सीएसवी फाइलों का संयोजन

$one = fopen('data5.csv', 'r'); 
$two = fopen('userdata.csv', 'r'); 

$final = fopen('final_data.csv', 'a'); 

$temp1 = fread($one, filesize("data5.csv")); 
$temp2 = fread($two, filesize("userdata.csv")); 

fwrite($final, $temp1); 
fwrite($final, $temp2); 
+0

या, यदि आपको अब मूल डेटा की आवश्यकता नहीं है तो आप दूसरी सीएसवी लाइन से लाइन पढ़ सकते हैं और इसे पहले जोड़ सकते हैं। समाप्त होने पर, दूसरा सीएसवी हटाएं और पहले नाम बदलें .. – Catalin

उत्तर

20

मैं तुम्हें अगर आप बड़ी राशि का उपयोग करने के लिए एक समाधान दे देंगे सीवीएस और आप अपनी मशीन की अधिकांश रैम का उपयोग नहीं करना चाहते हैं (कल्पना करें कि प्रत्येक सीएसवी 1 जीबी है, उदाहरण के लिए)।

<?php 
function joinFiles(array $files, $result) { 
    if(!is_array($files)) { 
     throw new Exception('`$files` must be an array'); 
    } 

    $wH = fopen($result, "w+"); 

    foreach($files as $file) { 
     $fh = fopen($file, "r"); 
     while(!feof($fh)) { 
      fwrite($wH, fgets($fh)); 
     } 
     fclose($fh); 
     unset($fh); 
     fwrite($wH, "\n"); //usually last line doesn't have a newline 
    } 
    fclose($wH); 
    unset($wH); 
} 

उपयोग:

<?php 
joinFiles(array('join1.csv', 'join2.csv'), 'join3.csv'); 

मज़ेदार तथ्य:

मैं सिर्फ यह प्रयोग किया जाता 500,000 लाइनों प्रत्येक के 2 CSV फ़ाइलों concat को ~। इसमें लगभग 5 सेकेंड लगे और 512 केबी मेमोरी का इस्तेमाल किया।

तर्क:

ओपन प्रत्येक फ़ाइल, एक पंक्ति को पढ़ने और फिर आउटपुट फ़ाइल के लिए लिखते हैं। हां, यह पूरे बफर लिखने की बजाय प्रत्येक पंक्ति को धीमा लिख ​​सकता है, लेकिन यह मशीन की स्मृति पर कोमल होने के दौरान भारी फ़ाइलों के उपयोग की अनुमति देता है। किसी भी समय, आप सुरक्षित हैं क्योंकि स्क्रिप्ट केवल एक समय में लाइन पर पढ़ती है और फिर इसे लिखती है।

आनंद लें!

+0

joinFiles सरणी पर लूप चलाने के दौरान हम एकाधिक फ़ाइलों में कैसे शामिल हो सकते हैं। कुछ ऐसा: ' ($ एफ = 1; $ एफ <= 98; $ एफ ++) { जॉइनफाइल (सरणी()); } ' –

2

कैसा रहेगा ...

file_put_contents('final_data.csv', 
    file_get_contents('data5.csv') . 
    file_get_contents('userdata.csv') 
); 

ध्यान दें कि यह लोड करता है PHP स्मृति में पूरे फ़ाइलें हालांकि। इसलिए, यदि वे बड़े हैं, तो आपको स्मृति_limit समस्याएं मिल सकती हैं।

0

तुम सिर्फ यह सोचते हैं आप ओएस की तरह यूनिक्स पर एक खोल स्क्रिप्ट को क्रियान्वित करने के साथ आसानी से दो फ़ाइलों आप ऐसा कर सकते श्रेणीबद्ध करना चाहते हैं:

exec("cat data5.csv > final_data.csv && cat userdata.csv >> final_data.csv"); 
संबंधित मुद्दे