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

时间:2015-06-10 19:24:36

标签: php file explode

当我使用制表符作为分隔符来展开.csv文件的行时,如下所示:

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

如果该行的最后一列为空(或者即使它不是),由于某种原因,$fields中的最后一个元素将包含换行符(\n)。这导致了问题,我无法弄清楚为什么会这样做,如果这是正常的,如何补偿它。

csv文件很典型:

col1\tcol2\tcol3\n
col1\tcol2\tcol3\n
...

* \ t和\ n是文件中的真实标签和新行。

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

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

所以现在我的问题是:

  1. 这是正常行为吗?

  2. 如果是这样,如果我在上一个$字段中没有换行符,我该怎么办呢?

1 个答案:

答案 0 :(得分:3)

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));