3

关于fgetcsv()文档,函数内部有一些参数fgetcsv():句柄、长度、分隔符、外壳和转义。

现在,我有两个问题:

  1. 外壳具体是做什么的?
  2. 我有一个每行 5 列的 csv 文件。想象它是这样的:1,2,3,4,5

所以索引是从 0 到 4。但是每当我想从索引 4 中获取日期时,就会返回一个空值。除非我在它后面加上一个逗号(通过在它后面填充一个额外的列,使内容如下:1,2,3,4,5,6)。我该如何解决这个问题?由于csv文件每行最后一项后缺少逗号,似乎存在一些问题!

4

3 回答 3

6

 1.enclosure参数是封装特定字段数据的字符,或“索引”。默认情况下,参数是 a ",这意味着您可以将字符串“包围”在"字符中。

例子:

1,2,"this is three",4


 2. 根据评论,您正在打电话fgetcsv($handle, 10000, ',')。您正在阅读的行可能超过 10000 个字符。尝试将长度更改为0,这将是“无限制”,看看是否有帮助。另一种解决方案是尝试将列的值括在双引号中。

于 2012-08-22T14:33:17.883 回答
2

Enclosure 是包含字段的字符。它是一种额外的分隔符。

例如hello,world有一个逗号作为字段分隔符,没有文本分隔符,而"hello","world"有一个引号作为文本分隔符。一些系统使用分隔值和非分隔值分别表示文本和数字字段(我相信 Microsoft Excel 会这样做)。这允许字段在其值中包含字段分隔符:

"Hello,world","Second Field","Third, and last, field".

其他一些系统仅包含包含字段分隔符的值或包含空格的值,这意味着在这些系统上,未分隔的值不一定是 numeric

如果您有一个“微不足道”的情况 - 未分隔的值,值内没有转义的字段分隔符(即,没有 'A,firstpartB\,secondpartB,C' 的东西) - 您可以完全跳过 CSV 转换并运行

  $line = fgets($file, MAX_EXPECTED_LINE_LEN);
  // This splits '  A, B, C ' into 'A', ' B' and ' C' (note spaces)
  $row = explode(',', trim($line)); // other delimiters can be used

或者

  // Consider "  , ", "," and ", " as the same delimiter
  // i.e. ' Alpha , Beta   ,    Gamma  ' gets split into 'Alpha', 'Beta' and 'Gamma'
  $row = preg_split('#\\s*,\\s*#', trim($line));

我似乎无法重现您遇到的问题;它可能与行尾的不同编码(即,CRLF 而不是 LF)有关吗?

在紧要关头,您可以将和fgetcsv两个组件分开,操纵调用之间的界限(使用,或者如果情况更糟,则通过附加缺少的逗号)。fgetsstr_getcsv()trim

于 2012-08-22T14:35:54.767 回答
0

它以这种方式对我有用:

while ($row = $stmt -> fecht()){
     echo "\"";
     echo $row['email'];
     echo "\"";
     // Export every row to a file
     $arr = array(',');
     fputcsv($data, $arr, ";", '"' );
}
于 2015-12-08T10:54:22.677 回答