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

时间:2015-10-26 08:22:58

标签: csvhelper

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

我的代码:

     var parser = new CsvParser(txtReader);
     delimiter = parser.Configuration.Delimiter;

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

4 个答案:

答案 0 :(得分:3)

我在site

中找到了这段代码
public static char Detect(TextReader reader, int rowCount, IList<char> separators)
{
    IList<int> separatorsCount = new int[separators.Count];

    int character;

    int row = 0;

    bool quoted = false;
    bool firstChar = true;

    while (row < rowCount)
    {
        character = reader.Read();

        switch (character)
        {
            case '"':
                if (quoted)
                {
                    if (reader.Peek() != '"') // Value is quoted and 
            // current character is " and next character is not ".
                        quoted = false;
                    else
                        reader.Read(); // Value is quoted and current and 
                // next characters are "" - read (skip) peeked qoute.
                }
                else
                {
                    if (firstChar)  // Set value as quoted only if this quote is the 
                // first char in the value.
                        quoted = true;
                }
                break;
            case '\n':
                if (!quoted)
                {
                    ++row;
                    firstChar = true;
                    continue;
                }
                break;
            case -1:
                row = rowCount;
                break;
            default:
                if (!quoted)
                {
                    int index = separators.IndexOf((char)character);
                    if (index != -1)
                    {
                        ++separatorsCount[index];
                        firstChar = true;
                        continue;
                    }
                }
                break;
        }

        if (firstChar)
            firstChar = false;
    }

    int maxCount = separatorsCount.Max();

    return maxCount == 0 ? '\0' : separators[separatorsCount.IndexOf(maxCount)];
}

separators是您可以拥有的分隔符。

希望有所帮助:)

答案 1 :(得分:2)

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

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

如果您只想使用其他分隔符进行解析,则可以设置csv.Configuration.Delimiterhttp://joshclose.github.io/CsvHelper/#configuration-delimiter

答案 2 :(得分:1)

由于我不得不处理以下可能性:根据用户的本地化设置,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];
}

我还需要重置读取器的读取位置,因为它与我在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

    }
}

答案 3 :(得分:0)

有(至少现在)设置为 false 的 DetectDelimiter 值。 然后你可以添加你想要测试的希望分隔符,尽管默认是明智的