Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php preg#u replace regex-跳过不带';不符合模式_Php_Regex_Csv - Fatal编程技术网

Php preg#u replace regex-跳过不带';不符合模式

Php preg#u replace regex-跳过不带';不符合模式,php,regex,csv,Php,Regex,Csv,我有一个CSV文件,我想用PHP解析它(我不想用PHP CSV函数,因为它们对于我的例子来说太慢了)。我使用preg_replace只选择我需要的列,并将输出写回标准输出。我有一个这样的图案 preg_replace("/^\"([^\"]*)\",\"([^\"]*)\"(.*)$/m", "$1;$2", $content); CSV中的某些行格式不正确。有没有办法跳过与上述模式不匹配的行的输出?您可以通过两个步骤完成: 首先删除所有与正则表达式不匹配的行: preg_replace("/

我有一个CSV文件,我想用PHP解析它(我不想用PHP CSV函数,因为它们对于我的例子来说太慢了)。我使用preg_replace只选择我需要的列,并将输出写回标准输出。我有一个这样的图案

preg_replace("/^\"([^\"]*)\",\"([^\"]*)\"(.*)$/m", "$1;$2", $content);

CSV中的某些行格式不正确。有没有办法跳过与上述模式不匹配的行的输出?

您可以通过两个步骤完成:

首先删除所有与正则表达式不匹配的行:

preg_replace("/^(?!\"([^\"]*)\",\"([^\"]*)\".*$).*\r?\n/m", "", $content);
然后替换原来的正则表达式

然而,你需要非常小心。一旦您在CSV字段中获得换行符和/或转义引号,这些正则表达式可能会打断并销毁您的文件

或者想象一个畸形的线条,比如

"foo","bar (missing quote!)
"baz", "bam" (correct line)

正则表达式现在会删除不完整的行和正确的行,因为
[^\“]*
也会吃掉新行。

你真的相信fgetcsv()或者str_getcsv比自制regexp慢?我希望看到一些基准测试结果是的,fgetcsv和str_getcsv都将数据解析到php数组中,这非常慢。使用stream_get_content和str_getcsv的解决方案需要33秒来解析290MB的CSV文件,而下面描述的解决方案需要大约5秒。有趣的结果,我必须运行我自己的一些测试…我有一个CSV应用程序,这种速度的提高对大型文件来说是一个真正的好处。感谢你的回答,特别是警告。我目前的想法是假设大多数CSV文件格式良好,所以我会使用正则表达式替换,并比较替换前后的字符串长度。如果它们相同,一切都一样没问题,否则我就一行一行地做。