解析TSV文件

我需要解析TSV格式的文件(制表符分隔值)。 我使用正则表达式将文件分解为每一行,但我找不到令人满意的解析每一行。 现在我来了:

(?("[^"]+")+|[^\t]+) 

但如果该行中的项目具有超过2个连续的双引号,则它不起作用。

以下是文件的格式:每个元素由制表分隔。 如果某个项目包含一个标签,则该标签包含双引号。 如果项目包含双引号,则会加倍。 但有时一个元素包含4个连续双引号,上面的正则表达式将元素分成2个不同的元素。

例子:

item1ok“item”“2”“oK”

正确解析为2个元素: item1ok项目“2”ok (修剪不必要的引号后),但是:

item1oK“item”“”“2oK”

被解析为3个元素: item1okitem“2ok (再次修剪后)”。

有谁知道如何让正则表达式适合这种情况? 或者是否有另一种解决TSV的解决方案? (我在C#中这样做)。

您可以使用TextFieldParser 。 这在技术上是一个VB程序集,但您可以通过引用Microsoft.VisualBasic.FileIO程序集在C#中使用它。

上面链接中的示例甚至显示在制表符分隔文件上使用它。

我建议您查看“ Fast CSV Reader ”或“ FileHelpers library ”,而不是尝试构建自己的CSV / TSV文件解析器(或使用String.Split)。

我正在使用第一个,并且非常满意它(它支持任何分隔符,例如逗号,分号,制表符)。

您可以尝试String.Split方法(Char [])方法,而不是使用RegEx。

我不知道C#,但这应该做的伎俩(在python中)

 txt = 'item1ok\t"item""2""oK"\titem1oK\t"item""""2oK"\tsomething else' regex = ''' (?: # definition of a field "((?:[^"]|"")*)" # either a double quoted field (allowing consecutive "") | # or ([^"]*) # any character except a double quote ) # end of field (?:$|\t) # each field followed by a tab (except the last one) ''' r = re.compile(regex, re.X) # now find each match, and replace "" by " and remove trailing \t # remove also the latest entry in the list (empty string) columns = [t[0].replace('""', '"') if t[0] != '' else t[1].strip() for t in r.findall(txt)][:-1] print columns # prints: ['item1ok', 'item"2"oK', 'item1oK', 'item""2oK', 'something else']