我正在将.CSV导入到具有以下内容的应用程序中:
if (($handle = fopen($file, "r")) !== FALSE) {
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
$num = count($data);
echo "<p> $num fields in line $row: <br /></p>\n";
$row++;
for ($c=0; $c < $num; $c++) {
echo $data[$c] . "<br />\n";
}
}
fclose($handle);
}
它有点奏效,但它远非完美。我想首先拿出行头并将它们放入一个数组中,然后遍历每一行以获取数据集。
似乎有划界问题,因为第一行(头)也包括第二行的几个部分。
我直接从Excel导出了.csv文件。不知道是否有编码技巧等我可能会丢失。
答案 0 :(得分:3)
听起来你的1000
限制不够长;你应该为它设置一个足够高的值...或者设置为0
无限制(不推荐,因为它往往更慢)。
首先将其设置为4096
或8192
并查看其进展情况。
// use 8kB buffer for reading comma delimited line
while (($data = fgetcsv($handle, 8192, ",")) !== FALSE) {
<强>更新强>
好的,第二个想法,也许你应该检查文件并确认一些事情:
答案 1 :(得分:1)
fgetcsv
并不总能正确检测到行结尾。
在fgetcsv调用之前尝试使用:
ini_set('auto_detect_line_endings', true);
答案 2 :(得分:0)
我改为8192并得到了相同的结果
while (($data = fgetcsv($handle, 8192, ",")) !== FALSE) {
...
}
然后做了这个并得到了相同的结果
$handle = fopen($_FILES['filename']['tmp_name'], "r");
ini_set('auto_detect_line_endings', true);
while (($data = fgetcsv($handle, 8192, ",")) !== FALSE) {
$data = array_map('mysql_real_escape_string', $data);
答案 3 :(得分:-1)
你为什么不使用file()?
$trimmed = file('somefile.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);