使用分隔符数组

时间:2015-05-15 09:03:30

标签: php csv delimiter

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

我现在正在做的是:

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

我想要的是这样的:

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

这有可能以一种简单的方式吗?由于CSV未标准化,因此您必须将分隔符限制为一个特定字符,这似乎很奇怪。

3 个答案:

答案 0 :(得分:5)

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

foo;bar,hello;world

什么是分隔符? ,;?如果您要传递数组array(',',';'),您期望fgetcsv()将返回哪些数据?

如果您不了解分隔符,则需要询问用户。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

为其他任何挣扎于此的人提供一个简单的答案。我解决的解决方案是将所有分隔符替换为特定字符。 像这样:

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