2

私はこれについてたくさん掘り下げましたが、探していたものがまったく見つかりませんでした。

入力:長さ97文字から500を超える範囲のASCIIテキストの複数(数百、場合によっては数千)行。このデータを保持するかどうかの基準は、最初の3文字(常に数字-任意の値100、200、300が私が興味を持っているものです)。

必要な出力は、100、200、または300で始まるものだけで、残りは無視できます。

これは、現在コンソールに出力するストリームリーダーとして私が持っているものです。

using System;
using System.Collections.Generic;
using System.IO;

class Program
{
public void Do
{

    // Read in a file line-by-line, and store in a List.

    List<string> list = new List<string>();
    using (StreamReader reader = new StreamReader("File.dat"))
    {
        string line;
        while ((line = reader.ReadLine()) != null)
        {
            list.Add(line); // Add to list.
            Console.WriteLine(line); // Write to console.
        //    Console.ReadLine();
        }
    }
}
}

私は言う行を入れたいと思っていました

IF {
FIRST3CHAR != (100,200,300) }
then skip,

しかし、FIRST3CHARクラスを定義する方法がわかりません。これは、生データに対して実行される唯一のフィルターです。

その後、そこに含まれる他の基準に基づいてこのフィルタリングされたデータセットを分析しますが、支援を求める前に自分でそれを試してみます。

4

3 に答える 3

5

このコードはより読みやすく、あなたが望むことをします:

var allowedNumbers = new[]{ "100", "200", "300" };
IEnumerable<String> lines = File
                   .ReadLines("File.dat")
                   .Where(l => allowedNumbers.Any(num => l.StartsWith(num)));

これで、たとえばforeach:を使用して行を列挙できます。

foreach(string line in lines)
{
    Console.WriteLine(line); // Write to console.
}

とにかくそれらの行を追加したいので、 :の代わりにList<string>使用できます。Enumerable.ToListforeach

List<string> list = lines.ToList();
于 2012-11-29T10:34:03.457 に答える
2

最も単純なレベルで:

if(line.StartsWith("100") || line.StartsWith("200") || line.StartsWith("300"))
{
    list.Add(line); // Add to list.
    Console.WriteLine(line); // Write to console.
}

ファイルが巨大な場合(数十万行など)、イテレータブロックとして実装することも検討する価値があります。しかし、「開始」テストは非常に簡単です。

より柔軟性が必要な場合は、正規表現を検討します。例えば:

static readonly Regex re = new Regex("^[012]00", RegexOptions.Compiled);

...
while (...)
{
    if(re.IsMatch(line))
    {
        list.Add(line); // Add to list.
        Console.WriteLine(line); // Write to console.
    }
}
于 2012-11-29T10:31:09.987 に答える
1

この条件をループに追加しない理由はありますか?

while ((line = reader.ReadLine()) != null)
{
    var beginning = line.Substring(0, 3);
    if(beginning != "100" && beginning != "200" && beginning != "300")
        continue;
    list.Add(line); // Add to list.
    Console.WriteLine(line); // Write to console.
}
于 2012-11-29T10:30:53.390 に答える