PHP fgetcsv()分隔符

时间:2012-08-22 14:27:15

标签: php csv fgetcsv readfile

关于fgetcsv()文档,fgetcsv()函数中有一些参数:Handle,length,delimiter,enclosure和escape。

现在,我有两个问题:

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

3 个答案:

答案 0 :(得分:6)

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

示例:

1,2,"this is three",4


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

答案 1 :(得分:2)

附件是包围字段的字符。它是一种额外的分隔符。

例如hello,world的逗号为字段分隔符,并且没有文本分隔符,而"hello","world"的引号为 text 分隔符。有些系统使用分隔和不限值来分别指示文本和数字字段(我相信Microsoft Excel可以)。这允许字段在其值中包含字段分隔符:

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

其他一些系统只包含包含字段分隔符的值或包含空格的值,这意味着在这些系统上不受限制的值不一定是数字

如果你有一个“琐碎”的情况 - 无限制的值,没有转义的字段分隔符内部值(即没有'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)?

在紧要关头,您可以在fgetcsvfgets这两个组件中划分str_getcsv(),操纵调用之间的线(trim,或者更糟糕的是最坏的情况是,附上缺少的逗号。

答案 2 :(得分:0)

这对我有用:

while ($row = $stmt -> fecht()){
     echo "\"";
     echo $row['email'];
     echo "\"";
     // Export every row to a file
     $arr = array(',');
     fputcsv($data, $arr, ";", '"' );
}