0

我正在使用以下内容将 .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

4 回答 4

3

听起来你的1000限制还不够长;您应该将其设置为该文件的足够高的值......或设置0为无限制(不推荐,因为它往往会更慢)。

将它设置为4096or8192先,看看它是如何进行的。

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

更新

好的,再想一想,也许您应该检查文件并确认几件事:

  1. 分隔符真的是逗号吗?(我猜你已经建立了这个)
  2. 字符串附件总是双引号吗?
  3. 字符串是否用反斜杠(默认)或另一个双引号转义?
于 2012-06-12T15:21:12.940 回答
1

fgetcsv并不总是正确检测行尾。

在 fgetcsv 调用之前尝试使用:

ini_set('auto_detect_line_endings', true);
于 2012-06-12T15:59:31.207 回答
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);
于 2016-03-07T16:51:19.913 回答
-1

你为什么不使用file()?

     $trimmed = file('somefile.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
于 2012-06-12T15:26:46.803 回答