PHP大CSV查找和替换不工作

时间:2015-07-23 13:14:43

标签: php csv

我有一个脚本在大型CSV文件中搜索\" and replacing it with just"`的实例。我现在的代码是:

$sourcePath = 'EstablishmentExport.csv';
$targetPath = 'custom-alpharoomsuk-establishmentexport.csv';
$source = fopen($sourcePath, 'r');
$target = fopen($targetPath, 'w');

while(! feof($source))
  {
  $line = str_replace('Villege\"', 'Villege"', fgets($source));
  fwrite($target, $line);
  }

fclose($source);
fclose($target);

这里的问题是它不能替换整个文件。当我在一个小文本文件中测试它时,它的工作原理。但在大CSV中,它不会取代它。

CSV中的行如下: "{A1306040-57DD-43BE-9328-55518FE52}","Tstufff","Fennel","No. 1-5ei Road, Checheng Villege\","","Pinljkgtung","","945","Nan-shih-pu","3 Star","","TW","0","test."

谁能告诉我为什么它不能取代Villege?脚本必须在服务器上运行,UNIX执行的unix命令会像php_exec一样做得更好吗?

2 个答案:

答案 0 :(得分:1)

看来问题可能实际上在于您的CSV。我敢打赌,你的CSV行以NEWLINE字符\n终止。据我所知,fgets在CARRIAGE RETURN,\r上分裂。我想在Notepad ++中,在特殊字符视图下,CSV的所有行只有一个尾随LF?所以会发生的是整个200,000+行CSV作为单个字符串加载。

现在你的问题还不清楚脚本是否有效,并且根本无法替换所有事件,或者它根本没有效果。

我复制了您的代码,并创建了一个类似的CSV文件,并使用所有3种形式的行终止\r\r\n\n进行了测试。我还放了一个循环计数器来告诉我它在循环中运行了多少次。当行仅以\n结束时,输出表示只找到并处理了1行。

我的环境有比PHP的默认值更高的内存限制,所以它运行3次没有问题,但在\n的情况下,它将使用更大量的内存,可能使用默认配置暂停环境。

所有这一切,我建议改为使用stream_get_line()。它的工作方式与fgets()非常相似,区别在于您可以指定行终止字符。

尝试使用以下内容替换包含fgets()的行:

$line = str_replace('Villege\"', 'Villege"', stream_get_line($source, 65535, "\n"));

65535中有限制给定行可能具有的字符数。这个数字足够高,可以适应您的情况。

答案 1 :(得分:0)

PHP并不是真的为此设计的。将工作卸载到另一个进程并调用它或从PHP启动它。我建议使用Python或Perl。

浏览以下链接

Parsing Large Text Files with PHP Without Killing the Server