我遇到了一些损坏的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
任何人都有一些帮助如何获得适用于这两种情况的正则表达式?
答案 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