通过 PHP 导入 CSV


CSV import via PHP

我正在导入一个 .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(不推荐,因为它往往较慢)。

首先将其设置为 40968192,看看效果如何。

// use 8kB buffer for reading comma delimited line
while (($data = fgetcsv($handle, 8192, ",")) !== FALSE) {

更新

好的,再三考虑,也许您应该检查文件并确认几件事:

  1. 分隔符真的是逗号吗?(我猜你已经建立了这个)
  2. 字符串外壳总是双引号吗?
  3. 字符串是否使用反斜杠(默认)或其他双引号进行转义?

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);