我只想删除"之间的","dellimiter。Exmp:"Alibris: Books, Music, & Movies"
第一行的输出应为
256,2653,"Alibris: Books Music & Movies",50263394,05/14/2013,07:44,50263394,114.85,1,5.74,05/14/2013,08:10
这里的阵列示例
Array
(
[0] => 256,2653,"Alibris: Books, Music, & Movies",50263394,05/14/2013,07:44,50263394,114.85,1,5.74,05/14/2013,08:10,
[1] => 256,2653,"Alibris: Books, Music, & Movies",50327805,05/21/2013,23:03,50327805,-6.99,1,-0.35,05/22/2013,07:10,
[2] => 256,2653,"Alibris: Books, Music, & Movies",50327805,05/21/2013,23:03,50327805,6.99,1,0.35,05/22/2013,00:10,
[3] => 527,36777,BuySKU,920130525042340263061,05/24/2013,20:25,1390043,"1,170.73",11,58.54,05/24/2013,20:55,
)
以下是我建议您采取的方法:
- 对于文件中的每一行
- 使用PHP的CSV函数将行读取到数组中(http://php.net/manual/en/function.fgetcsv.php)
- 可以使用str_replace修改要修改的数组元素
- 以CSV格式写出数组(http://www.php.net/manual/en/function.fputcsv.php)
关键是,您需要将字符串分解为其组成部分,而不是试图修改某些逗号,而不是其他逗号。
你可以这样做
,(?!([^"]*"[^"]*"[^"]*)+$|[^"]*$)
将其替换为空字符串
只有当前面有奇数个"
时,这才会匹配。因此,如果它在"
之间,它将匹配,
演示
所以,这将是
$pattern = "/,(?!([^'"]*'"[^'"]*'"[^'"]*)+$|[^'"]*$)/";
$replace = "";
$line = preg_replace($pattern,$replace,$line);
如果你想把它和,
分开,只在"
外面使用
,(?=([^"]*"[^"]*"[^"]*)+$|[^"]*$)
所以它将是
preg_split('/,(?=([^'"]*'"[^'"]*'"[^'"]*)+$|[^'"]*$)/', $text);
您可以在闭包中使用str_getcsv和str_replace来完成此
$rec = str_getcsv($line);
$rec = array_map(
function($x){
return str_replace(",", "", $x);
},$rec);
现在,您可以使用一个数组来调用fputcsv
如果您绝对需要将值作为字符串,则可以使用此处实现的str_putcsv实现。
请注意,此语法(内联闭包以及str_getcsv函数)仅适用于php5.3+