我正在使用CsvHelper将数据读/写到Csv文件中。现在我想解析csv文件的分隔符。我怎么能得到这个?
我的代码:
var parser = new CsvParser(txtReader);
delimiter = parser.Configuration.Delimiter;
我总是得到分隔符“,”但实际上在csv文件中分隔符是“\ t”。
答案 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.Delimiter
。 http://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 值。 然后你可以添加你想要测试的希望分隔符,尽管默认是明智的