0

重複の可能性:
ストリームリーダーからのフィルター処理されたデータに対して小計を実行する

データセット:「file.dat」内の数百行のデータ。それぞれの長さは80〜500ASCII文字です。

各文字列の特定の場所(区切られていない固定幅)に、4つの関連情報があります。

1)-NUMBERS-常に各文字列の最初の3文字にあり、文字列が私に関連しているかどうかを示す番号です。210、310、または410のいずれかが含まれている場合は、この行を処理します。それ以外の場合は、無視します。

2)-LETTERS-この情報の場所は、最初の3桁が210、310、または410のいずれであるかによって異なります。210の場合、場所406-409に含まれる値(常に文字)をアルゴリズムで確認する必要があります。最初の3桁が310の場合、322-325の値が必要です。410の場合、必要なのは478-481です。

3&4)-NUMBERS-最後の2つの情報は数値であり、1つは常に0で、もう1つは> 0です。どちらが非ゼロになるかわからないので、それらを足し合わせたいと思います。 。これらの番号は次の場所にあります。

       最初の番号の場所2番目の番号の場所             

210:.........129-140...................................。 ..142-153 ..

310:..........113-124..................................。 ... 126-137

410:..........113-124..................................。 ... 126-137

これで私がする必要があるのは、2)の文字の組み合わせごとに小計を提供することです。2)の値の範囲は、文字の約4〜5の異なる配置(ABCD、AAAA、BBBB、CCCC、DDDD)であるため、最終的な出力は次のようになります。

210AAAA「総数」

210BBBB「総数」

。

。

。

410DDDD「総数」

410ABCD「総数」

数字と文字のすべての組み合わせ(最大15)など。

これが明確であることを願っています、よろしくお願いします。

編集:現在のコード:

私は現在、一連のifとたくさんのvarを使ってそれを実行しようとしています。このコードが貼り付けられることを願っています:

class Program
{
    static void Main()
    {
        // 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)
            {
                var beginning = line.Substring(0, 3);
                // building this up atm
                // var letters210 = line.Substring(129,11);
                if (beginning != "210" && beginning != "310" && beginning != "410")
                    continue;

                list.Add(line); // Add to list.
                Console.WriteLine(line); // Write to console.
            }
        }
    }
}
4

1 に答える 1

0

特定の種類の行を処理し、すべての合計を集計するクラスを作成します。

public class LineHandler
{
    // Start indices and lengths for string and two numbers
    int si, sl, n1i, n1l, n2i, n2l;
    Dictionary<string, int> sums;

    public LineHandler(int si, int sl, int n1i, int n1l, int n2i, int n2l)
    {
        this.si = si; this.sl = sl; this.n1i = n1i;
        this.n1l = n1l; this.n2i = n2i; this.n2l = n2l;
        sums = new Dictionary<string,int>();
    }

    public void HandleString(string s)
    {
        string key = s.Substring(si, sl);
        int sum = int.Parse(s.Substring(n1i, n1l)) + int.Parse(s.Substring(n2i, n2l));
        if (sums.ContainsKey(key))
            sums[key] += sum;
        else
            sums[key] = sum;
    }

    public Dictionary<string, int> Sums { get { return sums; } }
}

次に、これらの辞書を作成して、各行に適切なものを選択できるようにします (長さが正しいことを再確認してください)。

    Dictionary<string, LineHandler> handlers = new Dictionary<string, LineHandler> {
        { "210", new LineHandler(406, 3, 129, 11, 142, 11) },
        { "310", new LineHandler(322, 3, 113, 11, 126, 11) },
        { "410", new LineHandler(478, 3, 113, 11, 126, 11) } };
    public Dictionary<string, int> Sums { get { return sums; } }
}

次に、行をループして、ハンドラーがある場合は各行を「処理」できます。

while ((line = reader.ReadLine()) != null)
{
    string key = line.Substring(0, 3);
    if (handlers.ContainsKey(key))
        handlers[key].HandleString(line);
}

次に、値にアクセスできます。

foreach(string key in handlers.Keys)
{
    LineHandler handler = handlers[key];
    foreach (string s in handler.Sums.Keys)
        Console.WriteLine("{0} {1} {2}", key, s, handler.Sums[s]);
}
于 2012-11-30T10:32:53.560 に答える