Я пытаюсь объединить два файла CSV в PHP. Я ищу идеальный метод. Вот мой код:
$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);
Я дам вам решение для использования, если у вас большие CVS, и вы не хотите использовать большую часть оперативной памяти вашего компьютера (например, каждый CSV составляет 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 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 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');
Интересный факт:
Я просто использовал это, чтобы выполнить 2 CSV-файла по 500 000 строк. Это заняло около 5 секунд и использовало 512kb памяти.
Логика:
Откройте каждый файл, прочитайте одну строку и затем напишите в выходной файл. Да, это может быть медленнее записывать каждую строку, а не писать весь буфер, но это позволяет использовать тяжелые файлы, будучи нежными в памяти машины. В любой момент вы в безопасности, потому что скрипт читает только по очереди, а затем записывает его.
Наслаждайтесь!
Как насчет…
file_put_contents('final_data.csv', file_get_contents('data5.csv') . file_get_contents('userdata.csv') );
Обратите внимание, что это загружает все файлы в память PHP. Итак, если они большие, вы можете получить проблемы с памятью.
Если вы хотите просто объединить два файла, вы можете сделать это легко с выполнением сценария оболочки, предполагая, что вы находитесь в unix, например os:
exec("cat data5.csv > final_data.csv && cat userdata.csv >> final_data.csv");