使用正则表达式在CSV文件中拆分()值
我有一个CSV文件,我正在解析。使用正则表达式在CSV文件中拆分()值
我正在使用split()将它们的逗号分开。
问题是,它是拆分字段中包含逗号的列。
解决方法是在分割中使用正则表达式来忽略逗号后面有空格的逗号(EG:“,”),并且只分割逗号而没有尾随空格(EG:“,”)。
现在我的分裂看起来是这样的:
$div = ',';
split('$div',$line);
我将如何修改我的分裂()调用?
我有一个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);
}
CSV文件的字段(尤其是如果字段已在他们逗号)应该在封装报价:
"A","B1,B2","C","D"
如果他们没有,那么这种模糊是你的第一个问题:
A,B1,B2,C,D
有五个字段,并且没有什么可以做的。
当您整理出源数据时,请使用fgetcsv
来解析它。
如果这是真的:
的解决方案是使用正则表达式的分裂与照顾他们的空间忽略逗号(EG:“”),只有分割逗号,没有尾随空格(EG:“,”)。
,经过他们所有的“内部”逗号有空格,那么你可以运行一个预处理步骤,所有,<space>
与\,
更换。逃离中CSV逗号解决该不确定性:
A,B1\,B2,C,D
为了解析与PHP的完整和有效的CSV文件,你只需要:
$data = array_map("str_getcsv", file($fn));
但如果你的文件格式是真的不相符,那么你会确实需要手动拆分方法和更具体的正则表达式。
preg_split('/,(?!\s)/', $line)
将是您可以用来匹配没有空格的comman的正则表达式。请注意,您需要使用PCRE库中的preg_split
,而不是旧的split
调用。
始终将它们用作字符串。像这样
$outstr .='"'.$line->linename.'",';
不要忘记把'$ line-> linename'中的引号转换为double - 引用。 – binaryLV 2011-05-30 14:02:41
@binaryLV嗨,老兄,谢谢,我想我已经用过双引号,不是或者我不明白你的意思吗? – 2011-05-30 14:04:26
字符串中的双引号应该用另一个双引号转义,即'$ line-> linename'应该是'str_replace(''','“'',$ line-> linename)'。如果你有3个值,'a','b'c'和'd',它们应该产生a,b,c,d, C”, “d”'。 – binaryLV 2011-05-30 14:27:48
你有任何外壳字符?像''''在旁注中,你是否考虑过[fgetcsv](http://php.net/manual/en/function.fgetcsv.php)? – Yoshi 2011-05-30 13:54:41
为什么不使用'fgetcsv()'或'str_getcsv ()'? – binaryLV 2011-05-30 13:55:04
什么变量具有你的列名? – 2011-05-30 13:55:50