Объединить два больших 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.

639   5  

5 ответов:

Не знаю, на какой операционной системе вы работаете, но если вы используете Linux, то paste команда, вероятно, намного проще, чем пытаться сделать это в PHP.

Если это жизнеспособное решение, и вам не обязательно делать это в PHP, вы можете попробовать следующее:

paste -d ',' file1 file2 > combined_file

Взгляните на функцию fgets. Вы можете прочитать одну строку каждого файла, обработать их и записать в новый файл, а затем перейти к следующей строке, пока не дойдете до конца файла.

PHP: 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() считывает одну строку из файла. Как вы можете видеть, этот код использует его в обоих файлах одновременно, записывая объединенные строки в третий файл. Руководство ЗДЕСЬ:

Http://php.net/fgets

Http://php.net/fopen

Http://php.net/fwrite

Попробуйте использоватьfgets () для чтения одной строки из каждого файла одновременно.

Я думаю, что решение для этого состоит в том, чтобы сопоставить первую строку начинается для каждой строки ( и какой-то ключ, Если вам нужно ), а затем сделать новый csv с помощью fread и fwrite ( теперь мы знаем начало и конец каждой строки, поэтому нам нужно просто искать и читать)

Другой способ-поместить его в MySQL (если это возможно ) , а затем обратно в новый CSV

Comments

    Ничего не найдено.