使用分隔符数组

Use array of delimiters

我正在使用 fgetcsv 在我的应用程序中读取 csv 文件。问题是我不知道我的用户是否会使用 ,|; 作为分隔符。如果我什么都不告诉 fgetcsv 它只会接受 , 但如果我告诉它使用特定的定界符它只会接受那个。

我现在做的是:

while (($row = fgetcsv($fileHandle, 4096)) !== false) { 

我想要的是这样的:

while (($row = fgetcsv($fileHandle, 4096, array(',', ';', '|'))) !== false) {

有没有可能用一些简单的方法?由于 CSV 未标准化,您必须将分隔符限制为一个特定字符,这似乎真的很奇怪。

如果您不知道 csv 文件的分隔符,则无法可靠地确定它。举个简单的例子:

foo;bar,hello;world

什么是分隔符? , 还是 ;?如果你要传递一个数组 array(',',';') 你期望什么数据 fgetcsv() 会 return?

如果您不知道分隔符,您需要询问用户。

使用 league/csv 包,它具有检测功能和更多功能,值得在 fgetcsv 上使用它。

只是想为遇到此问题的其他人提供一个简单的答案。我确定的解决方案是将所有定界符替换为特定字符。 像这样:

private function replaceDelimiters($file)
{
    // Delimiters to be replaced: pipe, comma, semicolon, caret, tabs
    $delimiters = array('|', ';', '^', "\t");
    $delimiter = ',';

    $str = file_get_contents($file);
    $str = str_replace($delimiters, $delimiter, $str);
    file_put_contents($file, $str);
}

请注意,这会将所有给定字符替换为“,”。因此,只有当您知道这些字符将仅用作分隔符而不是内容时,这才是一个不错的选择。 (就我而言)

也做了一个blog post