Php preg#u replace regex-跳过不带';不符合模式
我有一个CSV文件,我想用PHP解析它(我不想用PHP CSV函数,因为它们对于我的例子来说太慢了)。我使用preg_replace只选择我需要的列,并将输出写回标准输出。我有一个这样的图案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("/
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文件格式良好,所以我会使用正则表达式替换,并比较替换前后的字符串长度。如果它们相同,一切都一样没问题,否则我就一行一行地做。