我有一个脚本在大型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一样做得更好吗?
答案 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