【问题标题】:PHP fgetcsv() where source file doesn't have an enclosure character?PHP fgetcsv() 源文件没有附件字符的地方?
【发布时间】:2011-11-18 21:16:05
【问题描述】:

我有一个输入 CSV,其中“列”没有包含在任何内容中。

文件内容($input = fopen(文件名);):

1,2,3,4,5,6,7 a,b,c,d,e,f,g 9,8,7,6,5,4,3 z,y,x,w,v,u,t

我在让 fgetcsv() 工作时遇到问题,因为这些值周围没有包围。



    while($row = fgetcsv($input)) {
      print_r($row);
    }

结果:

1111

我已经尝试了一些我能想到的基本事情:

fgetcsc($file, 0, ',', '\');

fgetcsc($file, 0, ',', '');

有什么解决办法吗?手动编辑我的输入文件并不是一个真正的选择,因为它有几百万行。

【问题讨论】:

  • 呃...我应该只使用explode()。抱歉,今天是星期五...
  • fgetcsv 不依赖于引号/附件的存在。
  • 根据响应和进一步的测试,我相信我的输入文件以某种方式损坏,或者可能是一个非常奇怪的字符编码?感谢大家的帮助!
  • 当列中有一个双引号作为值时,这发生在我身上。无法信任外部数据源。

标签: php fgetcsv


【解决方案1】:

不清楚您的问题是什么。 fgetcsvstr_getcsv 也适用于无引号的列:

print_r(str_getcsv('1,2,3,4,5,6,7'));

返回:

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
    [5] => 6
    [6] => 7
)

引号是可选的,仅适用于可以在值中包含列分隔符的 CSV:

 column1, "Column 2 with , comma inside", colum3

【讨论】:

  • 嗯,那我可能还有另一个问题。谢谢!
  • 如果它确实是文件(有时换行类型可能有问题),然后尝试在 OpenOffice 上导入它并写回 .CSV 文件。有时变通办法是最好的选择。
  • 文件太大,我所知道的任何 Office 套件都无法打开...数百万行(行)。它本质上是一个数据库转储。
【解决方案2】:

您根本不必使用最后两个参数,它们是可选的。只需使用:

fgetcsv($file, 1000);

这将自动假定分隔符是逗号。此外,长度不得为 0,而是应读取的正数字符。

或者:你不必依赖fgetcsv,你可以使用explode

$values = explode(",", $row);

【讨论】:

  • PHP 5.0.4 及更高版本的长度参数是可选的,尽管指定长度应该更快。使用 0 没有长度限制。
【解决方案3】:

一个更合适的方法是将附件值更改为很少使用(或根本不使用)的值。

我发现最好的变体是 chr(0) 字符。

fgetcsv($handle, null, "\t", chr(0))

对我来说很好用,不应该中断,除非你有非常极端的 CSV 数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-11
    • 2021-03-21
    • 2011-11-07
    • 2015-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    相关资源
    最近更新 更多