首页 文章

PHP fgetcsv()分隔符

提问于
浏览
3

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

现在,我有两个问题:

  • 外壳究竟做了什么?

  • 我有一个csv文件,每行5列 . 想象一下这样的事情:1,2,3,4,5

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

3 回答

  • 2
    1. enclosure 参数是封装特定字段数据的字符,或"index" . 默认情况下,参数为 " ,这意味着 " 字符可以"enclose"个字符串 .

    例:

    1,2,"this is three",4
    

    2.根据评论,您正在调用 fgetcsv($handle, 10000, ',') . 它's possible, maybe, that the line(s) you'重读超过10000个字符 . 尝试将长度更改为 0 ,这将是"no limit",看看是否有帮助 . 另一种解决方案是尝试用双引号包装列的值 .

  • 6

    围栏是围绕该领域的角色 . 它是一种额外的分隔符 .

    例如 hello,world 的逗号为 field 分隔符,没有 text 分隔符,而 "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)?

    在紧要关头,您可以在两个组件 fgetsstr_getcsv() 中分割 fgetcsv ,操纵调用之间的线(使用 trim ,或者如果更糟糕的话,通过附加缺少的逗号来加剧) .

  • 0

    它以这种方式对我有用:

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

相关问题