Php CSV解析返回一个空数组
我有一个超级简单的CSV文件(大约500行,14.5k),我需要将其放入一个数组中,稍后我需要对照其他数据集检查ID列 CSV是这样的:Php CSV解析返回一个空数组,php,parsing,csv,Php,Parsing,Csv,我有一个超级简单的CSV文件(大约500行,14.5k),我需要将其放入一个数组中,稍后我需要对照其他数据集检查ID列 CSV是这样的: id,mail,Plan 102,,Plan_Pay 1028,,Plan_Pay 1031,,Plan_Prom 1032,,Plan_Pay 1033,,Plan_Pay 1034,xxxxxx@gmail.com,Plan_Free 1035,xxxxxx@gmail.com,Plan_Free 1036,xxxxxx@gmail.com,Plan_Pa
id,mail,Plan
102,,Plan_Pay
1028,,Plan_Pay
1031,,Plan_Prom
1032,,Plan_Pay
1033,,Plan_Pay
1034,xxxxxx@gmail.com,Plan_Free
1035,xxxxxx@gmail.com,Plan_Free
1036,xxxxxx@gmail.com,Plan_Pay
1079,,Plan_Prom
109,,Plan_Pay
1166,xxxxxx@elid.com,Plan_Prom
12,xxxxxx@gmail.com,Plan_Pay
....
....
(on and on .. about 500 lines)
但不管我如何解析它,我得到一个空数组
我试过用lib
还有变种
$csv = new parseCSV('id2.csv');
print_r($csv->data);// results empty
我也尝试过(从php.net):
我尝试了所有路径组合,相对(“id2.csv”
),绝对()http://path.to/id2.csv“
)等,但结果都一样
我的问题是:文件本身是否有问题?*。CSV是如此简单的格式,我有一个非常小的文件(大约500行)。
这可能是编码问题(它是没有bom的UTF-8)。或者可能是服务器问题?还是我只是做错了??(到目前为止,任何地方都没有可见的错误)
注意:如果PHP在读取Macintosh计算机上或由Macintosh计算机创建的文件时无法正确识别行尾,启用自动检测行尾运行时配置选项可能有助于解决此问题
如果您已经设置了自动检测\u行\u结尾
,这里有一个更简单的方法来读取csv
$csv = new SplFileObject("id2.csv", "r");
$csv->setFlags(SplFileObject::READ_CSV);
foreach($csv as $row) {
list($id,$mail,$plan) = $row;
// You your stuff
}
我不想说显而易见的事情,但是。。。你真的有权读取你试图打开的文件吗?@Filipos Karapetis,我想我有。它是本地计算机(xampp)上的本地主机服务器。从来没有这样的问题。另外,如果文件不存在,我有一个'if(!file_exists($filename)| |!is _readable($filename))`语句-或者它可能不好用enoug?
echo$csvf
不检查文件/路径是否存在…@Shomz-不,它不检查,但是如果(!file_exists($filename)| |!是否可读($filename))
会(或应该)@ObmerkKronen这样更好。我不相信这是问题所在。如果这是OP代码的问题,他/她将得到一个只有一个条目的数组,其中包含一个巨大的文本块。。。然而,OP得到的是一个完全空的array@Baba嗯……:-)既然你已经救了我好几次,我倾向于相信你:-)。但是我得到了这个错误:Uncaught异常“RuntimeException”,带有消息“SplFileObject::u构造(id2.csv)
。。(另外,我不知道是否相关,但它不是Mac文件-它是从WIN7上的Open Office导出的)@ObmerkKronen你是说该文件根本不被读取吗?如果是,请验证您的.csv
是小写字母还是.csv
大写字母…@baba-是小写字母。您的脚本实际上正在运行IMHO-因为输出错误需要很长时间。。它不是即时的(大约45秒)。所以我想它会做点什么。45秒?档案有多大?你有没有运行xdebug?
if ( !function_exists('fgetcsv') ) echo 'Server too old ... we need to check.';// but it is ok
function csv_to_array($filename, $delimiter=',')
{
if(!file_exists($filename) || !is_readable($filename)){
$data = array();
$data[] = 'no file'; // debug -verify there is file..
// echo 'no file'; // debug -verify there is file..
// return FALSE;
}
$header = NULL;
$data = array();
if (($handle = fopen($filename, 'r')) !== FALSE)
{
while (($row = fgetcsv($handle, 1000, $delimiter)) !== FALSE)
{
if(!$header)
$header = $row;
else
$data[] = array_combine($header, $row);
}
fclose($handle);
}
return $data;
}
$csv = csv_to_array($csvf);
echo $csvf; // debug verify correct path
print_r($csv);// results empty
$csv = new SplFileObject("id2.csv", "r");
$csv->setFlags(SplFileObject::READ_CSV);
foreach($csv as $row) {
list($id,$mail,$plan) = $row;
// You your stuff
}