0

我有一个制表符分隔的文本文件,其中包含以下格式的行:

I000001 \t I000002 \t "废话废话。废话。废话。废话"

我正在尝试拆分每个选项卡上的每一行,因此上面的行将分为三个部分

当没有空格或引号时,我已经能够根据需要拆分每一行,但是当有空格或引号时我遇到了困难。

这是我尝试过的类似于上面的行:

var x = from lines in data
        .Where(l => !string.IsNullOrEmpty(l))
        .Select(l => l.Split('\t'))
        select new 
        {
         A = lines[0].Trim(),
         B = lines[1].Trim(), 
         C = lines[2].Trim()
        };

上面生成了一个索引为 [0]、[1]、[2] 的数组。每个索引都有三个由上述字符串组成的成员(见下图)。它应该只有一个索引和三个成员。

在此处输入图像描述

请注意数组中的第一项如何具有三个元素。数组中还有两个项目,在第一个之下。它们都有 3 个元素,这三个元素包含用双引号括起来的字符串的其余部分。

解决方案:

根据选定的答案,引号内的句子中有额外的标签,导致额外的项目被添加到数组中。为了解决这个问题,我使用了一个正则表达式,改编自这个答案

line = Regex.Replace(line, @"""[^""]+""", m => m.Value.Replace('\t', ' '));
4

3 回答 3

2

使用Microsoft.VisualBasic.FileIo.TextfieldParser并将分隔符设置为\t.

这实际上是一个非常常见的问题,但人们通常会询问逗号,而不是制表符。

于 2013-07-23T12:56:53.703 回答
1

如果您使用Split('\t'),这将在每个制表符上拆分...因此,如果您的文本行按照您所说的那样拆分,那么它们中必须有制表符(在“”标记之间的文本中)。请检查...如果这样做,您可以在运行 Linq 查询之前使用正则表达式仅删除出现在引号内的制表符。

于 2013-07-23T15:09:17.197 回答
0

我建议使用此代码:

var data = new[] {"I000001 \t I000002 \t \"Blah blah blah. Blah. Blah Blah\""};

var x = from lines in data
        select (from s in lines.Split('\t')
            where !string.IsNullOrEmpty(s)
            select s.Trim())
        .ToArray();

在此示例中,只有一个制表符分隔的字符串,但如果您的输入数组中有更多,x 将是字符串数组的枚举,由制表符分隔的子项组成。

于 2013-07-23T13:12:10.623 回答