【问题标题】:PHP - Count number of columns in first line of .csv filePHP - 计算 .csv 文件第一行中的列数
【发布时间】:2015-10-01 16:20:28
【问题描述】:

我正在尝试计算第一个 .csv 文件行的列数。

这是我的文件内容(CRLF -> 回车和换行): 测试.csv

A;B;C;crlf

脚本:

$handle = fopen($filePath,'r');
$data = fgetcsv($handle, 1000, ";");
print_r($data) . PHP_EOL;
echo 'column nr.: ' . count($data) . PHP_EOL;

输出:

Array
(
    [0] => A
    [1] => B
    [2] => C
    [3] => 
)
column nr.: 4

如果行在最后一个之后结束,为什么函数包含空白列; 我希望只计算 3 列而不是 4。

谢谢

我使用以下方法省略了最后一个分号: 好的, CSV 现在每行有 25 列,并使用以下方法创建:

public function createRowForFile(Array $content, $fileName, $sep, $carriageReturnLineFeed) {
    $contentRow = '';
    $noSep = '';
    $lastColumn = count($content);
    $columnNr = 1;
    foreach ($content as $contentName => $contentValue) {
     // the semicolon after the last column is omited, because semicolonsdefine breaks between columns,
     // (
     // ex: A;B;C;  columns nr = 4 WRONG
     //     A;B;C   columns nr = 3 OK
     // ) 
      if ($lastColumn === $columnNr) {
        $sep = $noSep;
      }
      $columnNr++;

      $contentRow.= $contentValue . $sep;
    }
    $contentRow.= $carriageReturnLineFeed;
    $this->writeFileInDir($fileName, $contentRow);
  }

有什么建议吗?

【问题讨论】:

  • 发生这种情况是因为行尾有一个 extra ;。行尾实际上不是问题。你的线路应该是A;B;C\r\n
  • 否,PHP 在 IBMI 上运行 CSV 是在 Windows 上创建的,文件结尾不同,但我该如何解决这个问题?
  • @ Rocket Hazmat 这是现在的输出: Array ( [0] => A [1] => B [2] => C\r\n ) column nr.: 3 I don'不想要我的列数据中的 \r\n
  • 如果您使用 PHP创建 CSV 文件,那么我建议使用fputcsv()

标签: php csv fgetcsv


【解决方案1】:

您的文件中有 3 个分号,这意味着它定义了 4 列。而且,如果您在 Linux 上执行此操作,请检查 http://php.net/manual/en/filesystem.configuration.php#ini.auto-detect-line-endings 以使 fgetcsv 正确检测行尾。

【讨论】:

    【解决方案2】:

    传统上,最后一列后面没有分隔符;。 PHP 假设您有 4 列而不是 3。删除最后一个分号以获得 3 的结果。

    【讨论】:

    • 是的,我已经尝试过这个解决方案。但这种行为对我来说似乎不直观。至少从我的角度来看,分号表示列的结尾,而不是开头。但也许这只是我希望使脚本更简单的结果。不必省略最后一列的分号。谢谢大家
    • 分号定义列之间的分隔符,而不是列的结尾。传统上换行符(但它可能是另一个字符)定义一行何时结束。您的 CSV 数据是如何创建的?你能控制结束分号吗?如果数据集的大小合理,您始终可以在处理数据之前删除最后一列。
    猜你喜欢
    • 2012-12-30
    • 1970-01-01
    • 1970-01-01
    • 2015-12-06
    • 2019-03-26
    • 1970-01-01
    • 2015-08-27
    • 2012-11-20
    • 1970-01-01
    相关资源
    最近更新 更多