0

問題のファイルには 1 つ以上のブロックを含めることができ、各ブロックは Processname:;ABC Buying で始まります。

Linq を使用して、「Processname:; ABC Buying」行の発生に基づいてファイルの内容をブロックに分割する最良の方法は何ですか?

これは正しく動作していないようです...

var lines = File.ReadAllLines(path).OfType<string>().ToList();
var grps = lines.GroupBy(blocks => blocks.Contains("Processname:;ABC Buying"));

ファイル

Processname:;ABC Buying
ID:;31
Message Date:;08-02-2012

Receiver (code):;12345
Object code:


Location (code):;12345
Date;time
2012.02.08;00:00;0;0,00
2012.02.08;00:15;0;0,00
2012.02.08;00:30;0;0,00
2012.02.08;00:45;0;0,00
2012.02.08;01:00;0;0,00
2012.02.08;01:15;0;0,00
Processname:;ABC Buying
ID:;41
Message Date:;08-02-2012

Receiver (code):;12345
Object code:


Location (code):;12345
Date;time
2012.02.08;00:00;0;17,00
2012.02.08;00:15;0;1,00
2012.02.08;00:30;0;15,00
2012.02.08;00:45;0;0,00
2012.02.08;01:00;0;0,00
2012.02.08;01:15;0;9,00
4

2 に答える 2

0

だから..あなたは本当にアーメドが示したようなことをするべきです.

そうは言っても、次のような (あまり効率的ではない) コードを実行する Linq のみを使用して実行できます。

var lines = new[] { "wierd", "a1", "b1", "b2", "b3", "a2", "b4", "a3", "b5", "b6" };
List<List<string>> groups = lines
    .Select((x, i) => Tuple.Create(x, x.StartsWith("a") ? new int?(i) : null))
    .Aggregate(Tuple.Create<IEnumerable<Tuple<string, int>>, Nullable<int>>(Enumerable.Empty<Tuple<string, int>>(), null), 
        (acc, x) => x.Item2.HasValue
            ? Tuple.Create(acc.Item1.Concat(new[] { Tuple.Create(x.Item1, x.Item2 ?? -1) }), x.Item2)
            : Tuple.Create(acc.Item1.Concat(new[] { Tuple.Create(x.Item1, acc.Item2 ?? -1) }), acc.Item2))
    .Item1
    .GroupBy(x => x.Item2)
    .Select(x => x.Select(y => y.Item1).ToList())
    .ToList();

foreach(var group in groups) 
{
    Console.WriteLine("--New group--");
    foreach (var line in group)
    {
        Console.WriteLine(line);
    }
}

ここでテストしてください: https://compilify.net/2tr

于 2013-06-20T10:26:21.897 に答える