2015-01-22 4 views
-2

Итак, я посмотрел на fputcsv, но он, кажется, заменил весь файл. Есть ли способ, чтобы я мог заменить или отредактировать определенную строку в файле CSV с помощью PHP? Я НЕ хочу загружать (как массив или какую-либо другую структуру данных), весь CSV редактирует загрузку, а затем заменяет или перезаписывает файл. Я хочу отредактировать файл CSV на месте.Как отредактировать (заменить будет хорошо) строку в CSV-файле, используя php?

Например, если бы я example.csv, который выглядит как:

Name Amount Price 
Chair 500 20.00 
Boat 20  20000.00 

И я хотел бы заменить количество стула до 100. Как бы я идти о том, что простым редактированием файла CSV-? Могу ли я сделать это, не загружая весь файл. Я избегаю этого, потому что я думаю, что это будет довольно большой файл, и изменения могут происходить часто.

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

+0

простой str_replace() может работать, но у нас нет достаточного количества деталей –

+0

Это зависит, хотите ли Вы изменить п байтов данных в п байт данных. В этом случае вы можете легко изменить файл. Если вы хотите удалить или вставить данные в середину файла, вам нужно будет переписать его. – user4035

+0

@ Dagon Надеюсь, мои правки сделают вещи более понятными – Bren

ответ

4

мой вариант:

$f="file.csv"; 

$file=file_get_contents($f); 
$file = str_replace("Chair 500", "Chair 100", $file); 


file_put_contents($f, $file); 

«Опасность, Уилл Робинсон» не пытайтесь с файлом больше, чем доступная память

+0

Думаю, это так хорошо, как может быть. Удивленный php не может этого сделать. – Bren

+0

это php. что, где вы ожидаете? –

+0

arent вы все еще кладете файл в память? Я надеялся избежать этого. спасибо alot btw! – Bren

1

CSV, за все, что он содержит «отформатирован» данные, по-прежнему просто текстовый файл. Если то, что вы заменяете в файле, отличается от того, что есть, например. ваш 10 ->100, вам придется перезаписать файл, чтобы освободить место для дополнительных символов. Вы не можете просто найти, где находится 10, и начать писать, потому что это начнет перезаписывать все, что появилось после 10, например.

foo;10;bar  <--original 
foo;100bar  <--blind string replacement 

Теперь это не CSV-запись с 3 полями. Это двухпольная запись. Аналогично, для 10 ->2

foo;10;bar 
foo;20;bar 

10 ->2 вырывает два символа, пишет в один символ, и оставляет оригинальный 2-й символ на месте. Теперь вы удвоили свой счетчик, а не уменьшили его.

В основном вы должны сделать это:

1) open new temp file 
2) copy records from original CSV until you reach the record you want 
3) read record into client-side 
4) decode record into native data structure 
5) modify data 
6) write modified record out as csv to temp file 
7) copy the remainder of the original file 
8) delete original 
9) rename temp -> original