2013-05-28 35 views
0

我们以多种不同格式(CSV,TSV或其他使用更多异国定界符(|,等等)的平面文件)接收文件。这些文件也可以使用文本限定符,也是一系列格式(每个字段都限定,只限于那些包含限定符限定符,不同字符的','等)如何在平面文件(CSV,TSV等)中发现文本限定符?

我写了一个工具,能够成功识别文件中的分隔符使用的频率分析技术与此处提到的Python嗅探器类没有什么不同:How should I detect which delimiter is used in a text file?

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

我目前的做法是扫描文件寻找分隔符文本限定符对(例如, ,'和',),然后将它们与其他潜在配对(例如“和”)进行比较,并选择最常发生的配对。

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

回答

1

你可以尝试一些与正则表达式匹配的模式。既然你已经知道分隔符,你可以尝试一个常见的限定符列表,如"'。如果这些失败,您可以尝试解析具有与模式匹配的输入的不正确列对齐的行,并生成预期的列对齐。

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); 
} 
+0

谢谢,我会进一步研究。我认为正则表达式可能是一条可行的路线,但由于有几种情况需要考虑,所以正在努力思考正确的表达方式 - 如果第一个字段是文本限定的,那么它就是“...”,例如,而不是, “...”,这是翻转的文本合格的最后一场。你的答案可能只是我需要的跳板。 –

0

你可以使用正则表达式提取特殊字符的索引吗?在索引上你可以得到序列。

相关问题