使用此函数解析php im中的CSV文件:
private function _csvToArray($url, $delimiter=',')
{
$csvData = file_get_contents($url);
$lines = explode(PHP_EOL, $csvData);
$array = array();
foreach ($lines as $line) {
$array[] = str_getcsv($line, $delimiter);
}
return $array;
}
这里的问题是我使用EOL确定一条线的结束位置,如果CSV文件有任何字段,任何行结束字符都会出错。
示例:
Product_Name, "Description"
Product_Name, "Description"
Product_Name, "Description"
Product_Name, "Description"
这没关系,但如果我有这样的事情:
Product_Name, "Description_line_1
Description_line_2"
Product_Name, "Description_line_1
Description_line_2"
Product_Name, "Description_line_1
Description_line_2"
脚本会失败,有没有什么方法可以改进脚本以便考虑这个或者最好在调用sript之前使用正则表达式来修复CSV?
答案 0 :(得分:0)
这样的事情应该有用(没有正确测试代码):
$csv = array_map('str_getcsv', file($url), ',', '"');
我有一个旧代码,周围为我修复了一次...但请记住......它是从回来的方式;
$url = 'file.csv';
$csv = array();
$csvContents = file_get_contents($url);
$lines = explode('"'."\n", trim($csvContents));
foreach($lines as $lineNumber => $line) {
$csv[$lineNumber] = array();
$fields = explode(',', $line);
foreach($fields as $field) {
$csv[$lineNumber][] = ltrim(rtrim($field, '"'), '"');
}
}
答案 1 :(得分:0)
如果您想自己保存写入临时文件,可以使用内存流。
private function _csvToArray($url, $delimiter=',')
{
$fp = fopen('php://memory', 'r+');
fwrite($fp, file_get_contents($url));
fseek($fp, 0);
$array = array();
while ($row = fgetcsv($fp, 0, $delimiter)) {
$array[] = $row;
}
fclose($fp);
return $array;
}
答案 2 :(得分:0)
fgetcsv
可以在字段中处理EOL。
private function _csvToArray($url, $delimiter=',', $enclosure='"')
{
$handle = fopen($url, 'r');
$array = array();
while($row = fgetcsv($handle, 0, $delimiter, $enclosure))
{
$array[] = $row;
}
fclose($handle);
return $array;
}