Объединить два больших CSV файла с PHP
Я хочу объединить два больших CSV-файла с PHP. Эти файлы слишком велики, чтобы даже поместить в память все сразу. В псевдокоде я могу придумать что-то вроде этого:
for i in file1
file3.write(file1.line(i) + ',' + file2.line(i))
end
Но когда я перебираю файл с помощью fgetcsv, не совсем понятно, как я мог бы захватить строку n из определенного файла, не загрузив сначала все это в память.
Есть идеи?
Edit: я забыл упомянуть, что каждый из двух файлов имеет одинаковое количество строк, и они имеют один к одному отношения. То есть строка 62.324 в файле file1 совпадает со строкой 62.324 в файле file2.
5 ответов:
Не знаю, на какой операционной системе вы работаете, но если вы используете Linux, то
pasteкоманда, вероятно, намного проще, чем пытаться сделать это в PHP.Если это жизнеспособное решение, и вам не обязательно делать это в PHP, вы можете попробовать следующее:
paste -d ',' file1 file2 > combined_file
Взгляните на функцию
fgets. Вы можете прочитать одну строку каждого файла, обработать их и записать в новый файл, а затем перейти к следующей строке, пока не дойдете до конца файла.В частности, посмотрите на пример под названием Пример #1 чтение файла строка за строкой в руководстве PHP. Также важно отметить возвращаемое значение функций the
fgets.Возвращает строку длиной до - Один байты, считанные из файла, на который указывает ручка . Если больше нет данных, чтобы считайте в файле указатель, затем FALSE возвращенный.
Итак, если он не возвращает FALSE , вы знаете, что у вас все еще есть больше строк для обработки.
Вы можете использовать
fgets().$file1 = fopen('file1.txt', 'r'); $file2 = fopen('file2.txt', 'r'); $merged = fopen('merged.txt', 'w'); while ( ($line1 = fgets($file1)) !== false && ($line2 = fgets($file2)) !== false) { fwrite($merged, $line1 . ',' . $line2); }
fgets()считывает одну строку из файла. Как вы можете видеть, этот код использует его в обоих файлах одновременно, записывая объединенные строки в третий файл. Руководство ЗДЕСЬ:
Попробуйте использоватьfgets () для чтения одной строки из каждого файла одновременно.
Я думаю, что решение для этого состоит в том, чтобы сопоставить первую строку начинается для каждой строки ( и какой-то ключ, Если вам нужно ), а затем сделать новый csv с помощью fread и fwrite ( теперь мы знаем начало и конец каждой строки, поэтому нам нужно просто искать и читать)
Другой способ-поместить его в MySQL (если это возможно ) , а затем обратно в новый CSV
Comments