CsvHelper:如何从给定的csv文件中检测定界符

jam*_*015 5 csvhelper

我正在使用CsvHelper来将数据读/写到Csv文件中。现在,我想解析csv文件的定界符。我怎么能得到这个?

我的代码:

     var parser = new CsvParser(txtReader);
     delimiter = parser.Configuration.Delimiter;
Run Code Online (Sandbox Code Playgroud)

我总是得到分隔符为“,”,但实际上在csv文件中,分隔符为“ \ t”。

Ste*_*ven 8

由于我不得不处理这样一种可能性,根据用户的本地化设置,CSV 文件(保存在 MS Excel 中)可能包含不同的分隔符,因此我最终采用了以下方法:

public static string DetectDelimiter(StreamReader reader)
{
    // assume one of following delimiters
    var possibleDelimiters =  new List<string> {",",";","\t","|"};

    var headerLine = reader.ReadLine();

    // reset the reader to initial position for outside reuse
    // Eg. Csv helper won't find header line, because it has been read in the Reader
    reader.BaseStream.Position = 0;
    reader.DiscardBufferedData();

    foreach (var possibleDelimiter in possibleDelimiters)
    {
        if (headerLine.Contains(possibleDelimiter))
        {
            return possibleDelimiter;
        }
    }

    return possibleDelimiters[0];
}
Run Code Online (Sandbox Code Playgroud)

我还需要重置读取器的读取位置,因为它与我在 CsvReader 构造函数中使用的实例相同。

当时的用法如下:

using (var textReader = new StreamReader(memoryStream))
{
    var delimiter = DetectDelimiter(textReader);

    using (var csv = new CsvReader(textReader))
    {
        csv.Configuration.Delimiter = delimiter;

        ... rest of the csv reader process

    }
}
Run Code Online (Sandbox Code Playgroud)


Jos*_*ose 3

CSV 是Comma分离值。我认为您无法可靠地检测是否有使用分隔符的不同字符。如果有标题行,那么您也许可以依靠它。

您应该知道所使用的分隔符。打开文件时您应该能够看到它。如果文件的来源每次都为您提供不同的分隔符并且不可靠,那么我很抱歉。;)

如果您只想使用不同的分隔符进行解析,那么您可以设置csv.Configuration.Delimiter. http://joshclose.github.io/CsvHelper/#configuration-delimiter

  • @JoshClose 虽然 CSV 代表逗号分隔值,但不同的区域设置将有不同的分隔符。例如,在荷兰,我们使用分号作为列表分隔符。我想知道; 为什么 CsvHelper 不从 CultureInfo 中获取默认分隔符?这样,如果您执行一些忽略区域设置的自定义 CSV,则只需覆盖默认分隔符。 (4认同)
  • 是的,在挪威和荷兰,可能在所有使用逗号作为小数分隔符的国家/地区,csv 文件的默认分隔符是分号。例如,Excel 将在挪威语言环境中执行此操作。因此,不处理这个问题似乎与不处理非 ASCII 字符一样是相当典型的文化失明。 (3认同)
  • 我不同意这个答案。检测未知的用户上传文件中的分隔符是一个有效的问题。 (2认同)