当我用制表符分隔.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。由于您使用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));