使用fgets()读取文件会在每行的末尾留下新的行字符



当我用制表符分隔.csv文件的行时,如下所示:

// $handle = some TSV file
while (($line = fgets($handle)) !== false) {
    $fields = explode("t",$line);
}

如果行最后一列为空(或者即使不是),由于某种原因,$fields中的最后一个元素将包含换行符(n)。这引起了问题,我不太明白为什么会这样,如果是正常的,如何补偿它。

csv文件的典型格式如下:

col1tcol2tcol3n
col1tcol2tcol3n
...

* t和n是文件中真正的制表符和新行。

所以在这个例子中,如果col3为空,我的问题将持续存在。如果它不是空的,它甚至可能这样做。

注意:问题是,我插入的每一列到MySQL数据库和最后一列有一个换行符。当我将这个数据库导出为CSV时,它破坏了文件的布局。

所以现在我的问题是:

  1. 这是正常行为吗?

  2. 如果是这样,如果我不能在最后一个$字段中有换行符,我该怎么办?

1。由于您使用fgets(),是的,这是预期的行为,因为您捕获了整行,其中包括末尾的新行字符。

2。您可以使用fgetcsv()并指定分隔符为制表符,例如

$handle = fopen("test.csv", "r");
if ($handle) {
    while (($data = fgetcsv($handle, 4000, "t")) !== FALSE) {
        var_dump($data);
    }
    fclose($handle);
}

只是在这里添加一个替代解决方案:

您可以使用file()将文件放入数组中,并忽略末尾带有标志的新行字符,因此您可以执行与fgets()类似的操作。然后explode()每一行加一个制表符,例如

$data = array_map(function($v){
    return explode("t", $v);
}, file("yourFile.csv", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES));

相关内容

  • 没有找到相关文章