通过PHP导入CSV

时间:2012-06-12 15:17:35

标签: php csv import

我正在将.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文件。不知道是否有编码技巧等我可能会丢失。

4 个答案:

答案 0 :(得分:3)

听起来你的1000限制不够长;你应该为它设置一个足够高的值...或者设置为0无限制(不推荐,因为它往往更慢)。

首先将其设置为40968192并查看其进展情况。

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

<强>更新

好的,第二个想法,也许你应该检查文件并确认一些事情:

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

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