我需要解析TSV格式的文件(制表符分隔值)。我使用正则表达式将文件分解为每一行,但我找不到令人满意的解析每一行。 现在我来了:
(?<g>("[^"]+")+|[^\t]+)
但是如果该行中的项目具有超过2个连续的双引号,则它不起作用。
以下是文件的格式:每个元素由制表分隔。如果某个项目包含一个标签,则它会被双引号括起来。如果项目包含双引号,则会加倍。但有时一个元素包含4个连续的双引号,上面的正则表达式将元素分成2个不同的。
示例:
item1ok“item”“2”“oK”
被正确解析为2个元素: item1ok 和 项目“2”确定 (修改后)不必要的报价),但是:
item1oK“item”“”“2oK”
被解析为3个元素: item1ok , item 和 “2ok < / em> (再次修剪后)。
有谁知道如何让正则表达式适合这种情况?或者是否有另一种解决TSV的解决方案? (我在C#中这样做。)
答案 0 :(得分:7)
您可以使用TextFieldParser。这在技术上是一个VB程序集,但您可以通过引用Microsoft.VisualBasic.FileIO
程序集在C#中使用它。
上面链接中的示例甚至显示在制表符分隔文件中使用它。
答案 1 :(得分:6)
我建议您查看“Fast CSV Reader”或“FileHelpers library”,而不是尝试构建自己的CSV / TSV文件解析器(或使用String.Split)。
我正在使用第一个,并且非常满意它(它支持任何分隔符,例如逗号,分号,制表符)。
答案 2 :(得分:1)
您可以尝试String.Split Method (Char[]) 方法,而不是使用RegEx。
答案 3 :(得分:-1)
我不知道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']