正则表达式用于错误引用的CSV文件

时间:2017-11-06 09:20:55

标签: php regex csv preg-match

我遇到了一些损坏的csv-File问题。我明白了:

column1,column2,column3,column4,column5,column6
123,"some text",""column3 text"",""still column3 text"",4,234,""
123,"some text",""column3 text"",4,234,""

在表格中,它应该是这样的:

column1 | column2   | column3                            | column4 | column5 | column6
123     | some text | "column3 text, still column3 text" | 4       | 234     | 
123     | some text | "column3 text"                     | 4       | 234     |

我正在使用php读取该文件并尝试将其与str_getcsv一起用于数组。但由于这个破碎的引号,它不会起作用,并且总是有比标题更多的列。

根本我不需要第3列的值,所以我尝试做一些正则表达式来制作三个组然后做preg_replace。但是我没有得到适用于这两行的正则表达式。

有了这个正则表达式,我只得到第一行:https://regex101.com/r/OjTAAC/1

并且我得到了第二行:https://regex101.com/r/I2xqPs/1

任何人都有一些帮助如何获得适用于这两种情况的正则表达式?

1 个答案:

答案 0 :(得分:1)

可能有更简单的解决方案,我会备份或拥有该文件的副本,但您可能必须做它与它不同的大小。

让我们尝试不同的东西

//$str = '123,"some text",""column3 text"",""still column3 text"",4,234,""';
//$str = '123,"some text",""column3 text"",4,234,""'

while (($str = fgets($handle, 4096)) !== false) {      
     $str = str_replace('"', '', $str);
    $line = explode(',',$str);

    //combine line item 2,3
    if(count($line) == 7 ){
        $line[2] .= ', '.$line[3];
        //remove item 3
        unset($line[3]);
        $line = array_values($line);
    } 
    print_r( $line );
}

只要线条与您展示的内容一致,它就应该有效。

$array =[
    '123,"some text",""column3 text"",""still column3 text"",4,234,""',
    '123,"some text",""column3 text"",4,234,""'
];

foreach($array as $str){
    $str = str_replace('"', '', $str);
    $line = explode(',',$str);

    //combine line item 2,3
    if(count($line) == 7 ){
        $line[2] .= ', '.$line[3];
        //remove item 3
        unset($line[3]);
        $line = array_values($line);
    } 
    print_r( $line );
}

输出

Array
(
    [0] => 123
    [1] => some text
    [2] => column3 text, still column3 text
    [3] => 4
    [4] => 234
    [5] =>
)
Array
(
    [0] => 123
    [1] => some text
    [2] => column3 text
    [3] => 4
    [4] => 234
    [5] =>
)

你可以在这里测试一下。

http://sandbox.onlinephpfunctions.com/code/f39eb94ccef045213a30385cc7daa326ce3aa25d