【问题标题】:fgetcsv() wrongly adds double-quotes to first element of first linefgetcsv() 错误地将双引号添加到第一行的第一个元素
【发布时间】:2015-04-23 15:51:55
【问题描述】:

我对 fgtcsv() 有一个非常奇怪的问题。看这段代码

  $csv_check = fopen(CSV_DIR.$this->db_table.".csv","r");
  $data = fgetcsv($csv_check, 1000, $this->fields_terminated_by);
  fclose($csv_check);

print_r($data) 输出以下内容:

array (
0 => '"program_id"',
1 => 'program_name',
2 => 'program_logo',
)

奇怪的是,$data[0] 在这里被双引号引起来……这个 CSV 文件中的原始行如下所示:

"program_id";"program_name";"program_logo"

我完全不明白...用 strlen($data[0]) 计算 $data[0] 的字符返回 15,即使引用错误,它也必须是 12 个字符...我'我很震惊...!

有什么想法吗?!?

【问题讨论】:

  • csv 文件是否有 BOM 标头?如果是这样,那么它很可能被视为数据的一部分,这意味着引号也是数据的一部分,因为第一个引号出现在 BOM 标题之后,因此不被视为附件引号
  • 就是这样,@MarkBaker。谢谢!
  • 刚遇到这个问题。什么是 BOM 表头?你是怎么解决这个问题的?

标签: php double-quotes fgetcsv


【解决方案1】:

来自PHP.net notes

当提供 BOM 字符时,fgetscsv 可能会出现将第一个元素包含在“双引号”中。忽略它的最简单方法是在使用 fgetcsv 之前将文件指针前进到第 4 个字节。

<?php

// BOM as a string for comparison.
$bom = "\xef\xbb\xbf";

// Read file from beginning.
$fp = fopen($path, 'r');

// Progress file pointer and get first 3 characters to compare to the BOM string.
if (fgets($fp, 4) !== $bom) {
    // BOM not found - rewind pointer to start of file.
    rewind($fp);
}

// Read CSV into an array.
$lines = [];
while (!feof($fp) && ($line = fgetcsv($fp)) !== false) {
    $lines[] = $line;
}

【讨论】:

    【解决方案2】:

    我知道这是一个老话题,但由于有人可能会像我一样尝试找出解决方案,这里是如何解决它。

    打开记事本(在我的例子中,我使用的是记事本++)并创建一个新文件。
    复制/粘贴新文件中的所有数据。
    将其另存为“所有类型”并自己添加“.csv”。
    该文件应在没有 BOM 的情况下保存,您可以使用 PHP 读取您的 CSV 文件来处理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-13
      • 2019-10-05
      • 2019-02-23
      • 2017-05-04
      • 2018-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多