2011-05-30 43 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