我正在导入一个 .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文件。想知道是否有编码技巧等我可能丢失。
听起来你的1000
限制不够长;你应该为该文件设置一个足够高的值......或设置为"无限制"0
(不推荐,因为它往往较慢)。
首先将其设置为 4096
或8192
,看看效果如何。
// use 8kB buffer for reading comma delimited line
while (($data = fgetcsv($handle, 8192, ",")) !== FALSE) {
更新
好的,再三考虑,也许您应该检查文件并确认几件事:
- 分隔符真的是逗号吗?(我猜你已经建立了这个)
- 字符串外壳总是双引号吗?
- 字符串是否使用反斜杠(默认)或其他双引号进行转义?
fgetcsv
并不总是正确检测行尾。
尝试在 fgetcsv 调用之前使用:
ini_set('auto_detect_line_endings', true);
我更改为 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);
为什么不使用 file()?
$trimmed = file('somefile.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);