当我使用制表符作为分隔符来展开.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时,它会破坏文件的布局。
所以现在我的问题是:
这是正常行为吗?
如果是这样,如果我在上一个$字段中没有换行符,我该怎么办呢?
答案 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));