0

我们接收多种不同格式的文件 - CSV、TSV 或其他使用更多特殊分隔符(|、; 等)的平面文件。这些文件也可以使用文本限定符,同样在一系列格式中(每个字段都符合条件,而只有那些包含限定符的字段,使用不同的字符','等)。

我编写了一个工具,该工具能够使用频率分析技术成功识别文件中的分隔符,这与此处提到的 Python 嗅探器类不同:我应该如何检测文本文件中使用了哪个分隔符?

我现在正在尝试扩展该工具以支持文本限定文件。这里的困难在于频率分析不足以识别文本限定符,因为许多形式的 CSV 只会用文本限定符包装包含分隔符的字段,因此例如一个有 10k 行的文件可能整个文本限定符只有 2 次出现文件。

我目前的方法是扫描文件以查找分隔符-文本限定符对(例如,'和',),然后将它们与其他潜在的对(例如,,,和',)进行比较,并选择最常出现的。

谁能提供更强大的替代方案?这个问题的一个关键限制是我必须支持可以创建的许多不同风格的 CSV 文件中的任何一种。我的目标是在没有用户干预的情况下支持尽可能多的案例。

4

2 回答 2

2

您可以尝试使用正则表达式进行一些模式匹配。由于您已经知道分隔符,您可以尝试使用常见限定符列表,例如"or '。如果这些失败,您可以尝试解析列对齐不正确的行,以获取与模式匹配并产生预期列对齐的输入。

var delimiter = ",";
var qualifiers = new[] { "\"", "'" };
var input = @"""Hello, World"", Hello, World";
var pattern = @"(?<={1}).*{0}.*(?={1})";

foreach(var p in qualifiers.Select(q => string.Format(pattern, delimiter, q)))
{
    Regex.Match(input, p);
}
于 2013-05-28T12:37:01.773 回答
0

您可以使用正则表达式提取带有索引的特殊字符吗?在索引上,您可以获得序列。

于 2013-05-28T13:33:01.843 回答