使用分隔符数组

Chr*_*fer 4 php csv delimiter

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

我现在正在做的是:

while (($row = fgetcsv($fileHandle, 4096)) !== false) { 
Run Code Online (Sandbox Code Playgroud)

我想要的是这样的:

while (($row = fgetcsv($fileHandle, 4096, array(',', ';', '|'))) !== false) {
Run Code Online (Sandbox Code Playgroud)

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

hek*_*mgl 5

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

foo;bar,hello;world
Run Code Online (Sandbox Code Playgroud)

什么是分隔符?,还是;?如果您要传递一个数组array(',',';'),您期望fgetcsv()返回的数据是什么?

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

  • 然后它不再是CSV了.CSV仅支持单个分隔符.为什么不在解析之前用`,`替换`;`?除非你有一个巨大的输入文件,否则它可能没问题. (2认同)

Chr*_*fer 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);
}
Run Code Online (Sandbox Code Playgroud)

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

还写了一篇关于它的博客文章