2009-09-02 42 views
0

好吧,我有一個CSV文件是這樣的:如何在php中用雙引號替換「新行」字符?

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 

等等...

的文件有近55萬線。 如何一次性替換雙引號內的所有\ n個字符?

我使用PHP 5.可以通過preg_replace()完成嗎?

+0

是否有\」裏面這些雙引號的? – Havenard 2009-09-02 00:34:12

+0

是的,我有引號內斜線的一些記錄。 – 2009-09-02 00:39:48

+0

我喜歡的正則表達式,但在這種情況下,它是不是安全。 – Havenard 2009-09-02 00:46:25

回答

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()會將引號中的新行字符識別爲字段的一部分,而不是附加的數據行。

+0

fgetcsv()的作品完美,感謝您所有傢伙!我是PHP的新手,並不知道這個功能。 無論如何,我想看到正則表達式模式... – 2009-09-02 00:55:32

+0

很高興能成爲服務,我只接觸過fgetcsv( )最近我自己 - 無法幫助您處理RegEx方面的事情,我可以使用它們,但我不確定如何使其適用於這種情況。 – 2009-09-02 01:31:01

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 
0

我不是在極其複雜的正則表達式的太精通,所以假設你'尋找一次性轉換我會寫一個快速腳本來打開php中的csv,讀取文件(fgetcsv內置到php5中)並將(fputcsv)逐行寫入一個新文件,同時str_replace'換行符。

(如果我不是在找計算器上的怪物正則表達式,那是。)

相關問題