0

次の形式の行を含むタブ区切りのテキスト ファイルがあります。

I000001 \t I000002 \t "何とか何とか何とか。何とか何とか何とか"

すべてのタブで各行を分割しようとしているので、上記の行は 3 つの部分に分割されます

スペースや引用符がない場合は各行を希望どおりに分割できましたが、スペースがある場合は苦労しています。

上記のような行で試したのは次のとおりです。

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 つのメンバーがあります (下の画像を参照)。3 つのメンバーを持つインデックスを 1 つだけ持つ必要があります。

ここに画像の説明を入力

配列の最初の項目に 3 つの要素があることに注意してください。配列には、最初の項目の下にさらに 2 つの項目があります。どちらにも 3 つの要素があり、これらの 3 つの要素には、二重引用符で囲まれた残りの文字列が含まれています。

解決:

選択した回答によると、引用符内の文に余分なタブがあり、配列に追加の項目が追加されました。これを解決するために、この回答から適応した正規表現を使用しました:

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

3 に答える 3

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();

この例では、タブ区切りの文字列は 1 つしかありませんが、入力配列に複数の文字列がある場合、x は、タブ区切りのサブ項目で構成される文字列の配列の列挙になります。

于 2013-07-23T13:12:10.623 に答える