Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 解析TSV文件_C#_Regex_Parsing - Fatal编程技术网

C# 解析TSV文件

C# 解析TSV文件,c#,regex,parsing,C#,Regex,Parsing,我需要解析TSV格式的文件(以制表符分隔的值)。我使用正则表达式将文件分解为每一行,但我无法找到一个令人满意的正则表达式来解析每一行。 现在,我提出了以下问题: (?<g>("[^"]+")+|[^\t]+) (?(“[^”]+”+|[^\t]+) 但是,如果行中的某个项目有两个以上的连续双引号,则该选项不起作用 文件的格式如下:每个元素由一个表格分隔。如果一个项目包含一个制表符,它将被双引号包围。如果一个项目包含一个双引号,它将被加倍。但有时一个元素包含4个连续的双引号,上面的

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

(?<g>("[^"]+")+|[^\t]+)
(?(“[^”]+”+|[^\t]+)
但是,如果行中的某个项目有两个以上的连续双引号,则该选项不起作用

文件的格式如下:每个元素由一个表格分隔。如果一个项目包含一个制表符,它将被双引号包围。如果一个项目包含一个双引号,它将被加倍。但有时一个元素包含4个连续的双引号,上面的正则表达式将该元素拆分为两个不同的双引号

示例:

项目1“确定”项目“2”确定

被正确解析为两个元素:item1okitem“2”ok(在删除不必要的引号后),但是:

项目1确定“项目2确定”

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


有人知道如何使正则表达式适合这个情况吗?或者有没有其他简单解析TSV的解决方案?(我正在用C#)进行此操作。

如果不使用正则表达式,也许您可以尝试此方法。

如果不尝试构建自己的CSV/TSV文件解析器(或使用String.Split),我建议您看看“”或“”

我使用的是第一个,我对此非常满意(它支持任何分隔符,例如逗号、分号、制表符)。

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

上面链接中的示例甚至显示了在选项卡分隔的文件上使用它。

我不知道C#但这应该可以做到(在python中)


我使用过Lumenworks CSV阅读器,效果很好,可以作为TSV阅读器的良好基础。这当然是一个很好的解决方案,但我想避免对代码的额外依赖,因此.net类答案更适合我的需要。M4N,Lumenworks的CSV阅读器效果很好,只是它在CSV和TSV之间混淆了(我想,无论如何)在特定的行上,因为逗号和引号在同一行上。你知道如何让它只看分离的标签吗?忽视了,解决了问题:String。Strut.()将把被包围的表也看作分隔符,所以这是不正确的。我能说什么?我知道,我很差劲。+1它是.Net框架的一部分:它受Microsoft支持,不需要单独部署。只是为了让大家知道,由于VisualBasic代码不是开源的,也没有移植,所以它在Dotnet核心和Dotnet标准中不可用。。这个问题是专门针对C#的。。用另一种语言发布解决方案没有帮助。
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']