0

パイプで区切られたフラットファイルがあり、例として次のようになります

列A|列B|3*|注1|注2|注3|2**|A1|A2|A3|B1|B2|B3

最初の 2 つの列は設定されており、常に存在します。

* は、そのカウントに続く繰り返しフィールドの数を示すため、注 1 2 3

** は、フィールドのブロックが繰り返される回数を示し、ブロックには常に 3 つのフィールドがあります。

これは行ごとであるため、各行には異なる数のフィールドが含まれる場合があります。

これまでのところ、それが理にかなっていることを願っています。

このファイルを解析する最善の方法を見つけようとしています。

最終的な目標は、これらすべてのフィールドをいくつかの異なるファイルにマップすること、つまりデータ変換です。私は実際にこれらすべてを SSIS 内で行っていますが、既定のコンポーネントでは十分ではないため、独自のコードを記述する必要があると考えました。

更新私は基本的にこれをソースファイルのように読み、その間のいくつかのフィールドに対していくつかのルックアップと文字列操作を行い、通常のファイルからファイルへの変換SSISパッケージのようにいくつかの異なるファイルを吐き出そうとしています。

上記の例を使用して、最終的に次のような新しいファイルを作成したい場合があります

"ColA"、"HardcodedString"、"Note1CRLFNote2CRLF"、"ColB"

そして、別のファイル

行 1: "ColA"、"A1"、"A2"、"A3"

行 2: "ColA"、"B1"、"B2"、"B3"

だから私は、これを解析する方法と、データをスタックまたはリストに保存する方法についていくつかのアイデアを求めていると思います。で遊んで、後で吐き出します。

4

3 に答える 3

2

1 つの可能性は、スタックを使用することです。まず、パイプでラインを分割します。

var stack = new Stack<string>(line.Split('|'));

次に、スタックから最初の 2 つをポップして邪魔にならないようにします。

stack.Pop();
stack.Pop();

次に、次の要素 3* を解析します。そのために、スタック上の次の 3 つのアイテムをポップします。2** を指定すると、スタックから次の 2 x 3 = 6 個のアイテムがポップされます。スタックが空になるとすぐに停止できます。

while (stack.Count > 0)
{
    // Parse elements like 3*
}

これが十分に明確であることを願っています。String.Split () に関しては、この記事が非常に役に立ちます。

于 2012-11-07T23:34:41.647 に答える
1

以下のようなものが動作するはずです (これはテストされていません)。

ColA|ColB|3*|Note1|Note2|Note3|2**|A1|A2|A3|B1|B2|B3

string[] columns = line.Split('|');
List<string> repeatingColumnNames = new List<string();
List<List<string>> repeatingFieldValues = new List<List<string>>();
if(columns.Length > 2)
{
    int repeatingFieldCountIndex = columns[2];
    int repeatingFieldStartIndex = repeatingFieldCountIndex + 1;
    for(int i = 0; i < repeatingFieldCountIndex; i++)
    {
        repeatingColumnNames.Add(columns[repeatingFieldStartIndex + i]);
    }

    int repeatingFieldSetCountIndex = columns[2 + repeatingFieldCount + 1];
    int repeatingFieldSetStartIndex =  repeatingFieldSetCountIndex + 1;

    for(int i = 0;  i < repeatingFieldSetCount; i++)
    {
        string[] fieldSet = new string[repeatingFieldCount]();

        for(int j = 0; j < repeatingFieldCountIndex; j++)
        {                             
            fieldSet[j] = columns[repeatingFieldSetStartIndex + j  + (i  * repeatingFieldSetCount))];
        }
        repeatingFieldValues.Add(new List<string>(fieldSet));
     }
}
于 2012-11-08T00:58:44.443 に答える
-1
System.IO.File.ReadAllLines("File.txt").Select(line => line.Split(new[] {'|'}))
于 2012-11-07T23:31:29.170 に答える