好的,我有一个像这样的csv文件:
14 ; 1234,56 ; 10203 ; "ABC" ; "DFG" ; "Lorem \n ipsum \n dolor sit" \n
15 ; 234,16 ; 10204 ; "ABC" ; "DFG" ; "Lorem \n ipsum \n dolor sit" \n
16 ; 1234,15 ; 10304 ; "CCC" ; "DFG" ; "Lorem ipsum/dolor \n sit amet\consec" \n
依旧......
该文件有近550000行。 如何一次替换双引号内的所有\ n字符?
我正在使用PHP 5.可以通过preg_replace()来完成吗?
答案 0 :(得分:2)
我不知道您是否使用fgetcsv(),但您可以将其配置为识别包含引用信息的各个字段。
通过这种方式,您可以一次读取一行,并在字段级别删除新行字符,而不必一次对大文件执行昂贵的RegEx操作。
文档中稍微修改过的php代码示例(用';'替换了分隔符):
$row = 1;
$handle = fopen("data.txt", "r");
while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {
$num = count($data);
echo "<p> $num fields in line $row: <br /></p>\n";
$row++;
for ($c=0; $c < $num; $c++) {
echo $data[$c] . "<br />\n";
}
}
fclose($handle);
data.txt中
14 ; 1234,56 ; 10203 ; "ABC" ; "DFG" ; "text
text
more text"
15 ; 234,16 ; 10204 ; "ABC" ; "DFG" ; "text
text
more text"
这将被识别为2行而不是6行,因为fgetcsv()会将引号中的新行字符识别为字段的一部分而不是其他数据行。
答案 1 :(得分:0)
那么你在某些行上实际上有字符串'\n'
(不是换行符号)吗?如果是这样,您只需要转义换行符:
str_replace("\\n", "*foo*", $csv)
// this will make the following change:
14 ; 1234,56 ; 10203 ; "ABC" ; "DFG" ; "text \n text \n more text" \n
// that to this:
14 ; 1234,56 ; 10203 ; "ABC" ; "DFG" ; "text *foo* text *foo* more text" \n
答案 2 :(得分:0)
PHP具有特定于读取CSV文件的功能:fgetcsv();
答案 3 :(得分:0)
我不太熟悉极其复杂的正则表达式,所以假设你正在寻找一次转换我会编写一个快速脚本来打开php中的csv,读取文件(fgetcsv内置到php5中)并写入(fputcsv)在str_replace'ing换行符时逐行放入一个新文件。
(如果我没有在stackoverflow上寻找怪物正则表达式,那就是。)