如何在php中的双引号内替换“new line”字符?

时间:2009-09-02 00:31:54

标签: php regex csv

好的,我有一个像这样的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()来完成吗?

4 个答案:

答案 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上寻找怪物正则表达式,那就是。)