2011-05-30 71 views
0

我有一個CSV文件,我正在解析。使用正則表達式在CSV文件中拆分()值

我正在使用split()將它們的逗號分開。

問題是,它是拆分字段中包含逗號的列。

解決方法是在分割中使用正則表達式來忽略逗號後面有空格的逗號(EG:「,」),並且只分割逗號而沒有尾隨空格(EG:「,」)。

現在我的分裂看起來是這樣的:

$div = ','; 
split('$div',$line); 

我將如何修改我的分裂()調用?

+0

你有任何外殼字符?像''''在旁註中,你是否考慮過[fgetcsv](http://php.net/manual/en/function.fgetcsv.php)? – Yoshi 2011-05-30 13:54:41

+2

爲什麼不使用'fgetcsv()'或'str_getcsv ()'? – binaryLV 2011-05-30 13:55:04

+0

什麼變量具有你的列名? – 2011-05-30 13:55:50

回答

0

我有一個CSV文件,我解析。

你重新發明輪子:PHP必須自己完成這一點,即fgetcsv的精細方法:

if (($handle = fopen("test.csv", "r")) !== FALSE) { 
    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); 
} 
1

CSV文件的字段(尤其是如果字段已在他們逗號)應該在封裝報價:

"A","B1,B2","C","D" 

如果他們沒有,那麼這種模糊是你的第一個問題:

A,B1,B2,C,D 

有五個字段,並且沒有什麼可以做的。

當您整理出源數據時,請使用fgetcsv來解析它。


如果這是真的:

的解決方案是使用正則表達式的分裂與照顧他們的空間忽略逗號(EG:「」),只有分割逗號,沒有尾隨空格(EG:「,」)。

,經過他們所有的「內部」逗號有空格,那麼你可以運行一個預處理步驟,所有,<space>\,更換。逃離中CSV逗號解決該不確定性:

A,B1\,B2,C,D 
2

爲了解析與PHP的完整和有效的CSV文件,你只需要:

$data = array_map("str_getcsv", file($fn)); 

但如果你的文件格式是真的不相符,那麼你會確實需要手動拆分方法和更具體的正則表達式。

preg_split('/,(?!\s)/', $line) 

將是您可以用來匹配沒有空格的comman的正則表達式。請注意,您需要使用PCRE庫中的preg_split,而不是舊的split調用。

0

始終將它們用作字符串。像這樣

 
$outstr .='"'.$line->linename.'",'; 

+0

不要忘記把'$ line-> linename'中的引號轉換爲double - 引用。 – binaryLV 2011-05-30 14:02:41

+0

@binaryLV嗨,老兄,謝謝,我想我已經用過雙引號,不是或者我不明白你的意思嗎? – 2011-05-30 14:04:26

+0

字符串中的雙引號應該用另一個雙引號轉義,即'$ line-> linename'應該是'str_replace(''','「'',$ line-> linename)'。如果你有3個值,'a','b'c'和'd',它們應該產生a,b,c,d, C」, 「d」'。 – binaryLV 2011-05-30 14:27:48