我创建了这个 PHP 函数来将 CSV 解析为二维数组。它可以处理包含逗号、引号或换行符的数据。这比其他一些可行的解决方案运行得更快。
/**
* copyright 2018 Frank Forte
* Free for personal, non-commercial use
* contact me for inexpensive licenses to use and create derivative works
*/
protected static function parse_csv_forte (&$str, $delimiter = ",", $enclosure = '"', $escape = '"', $skip_empty_lines = true, $trim_fields = false)
{
// use linux line endings
$str = str_replace("\r\n","\n",$str);
$str = str_replace("\r","\n",$str);
// substitute line endings that are part of data
$num = strlen($str);
$quoted = false;
$last = null;
$escape = false;
for($i = 0; $i < $num; $i++)
{
if($str[$i] == $enclosure)
{
if($last == $enclosure)
{
$escape = !$escape;
if($escape)
{
$quoted = !$quoted;
}
}
else
{
if(!$escape)
{
$quoted = !$quoted;
}
}
}
if($str[$i] != $enclosure || $escape)
{
$escape = false;
}
if($quoted && $str[$i] == "\n")
{
$str[$i] = "\r";
}
$last = $str[$i];
}
if($skip_empty_lines)
{
$str = preg_replace("/\n+/","\n",$str);
$str = trim($str,"\n");
}
$str = explode("\n",$str);
$csv = [];
foreach($str as $e)
{
$e = str_getcsv($e, $delimiter, $enclosure, $escape);
foreach($e as $k => $f)
{
$e[$k] = str_replace("\r","\n",$f);
if($trim_fields)
{
$e[$k] = trim($e[$k]);
}
}
$csv[] = $e;
}
return $csv;
}
像这样使用它:
$csv = parse_csv_forte(file_get_contents('file.csv'));