0

固定幅形式 (8 文字 x 10 列) でデータを読み取るためのパーサーに取り組んでいます。ただし、そうでない場合もあり、これを満たさない領域に有効なデータがある場合もあります。エスケープ文字 (下の図の + など) があると想定するのは安全ではありません。これはいくつかの形式の 1 つです。

TextFieldParser.FixedWidth を使用して 8x10 の入力を試みましたが、この量に満たないものはすべて代わりに ErrorLine に送信されます。

  1. 例外をキャッチするブロックから解析するのは良い習慣とは思えませんね。

  2. 追加の作業が必要なのは不一致の行だけなので、ブルートフォースサブメソッドが最善のアプローチですか? すべてのデータは常に 8 文字のブロックになります。行の最後のブロックは、手動で入力すると短くなる可能性があるという点で扱いにくい場合があります。(#1 は実行しても問題ないことを前提としています)

  3. 使用するより良いツールはありますか?固定幅のテキストフィールドパーサーで丸い穴に四角いペグをはめようとしているような気がします。

注: 区切り構文解析はオプションではありません。2 番目の図を参照してください。

明確化のために編集: 以下のテキストは、有限要素コードである NASTRAN の入力デッキの抜粋のペアです。私は、テキスト ファイルを読み取り、分割された string[] を他のメソッドに渡して、実際に各カードを特定のマップされたオブジェクトに処理する、一般化された解析メソッドを持つことを目指しています。(例: 下の画像では、2 つのオブジェクト タイプは RBE3 と SET1 です)

抽出方法:

    public static IEnumerable<string[]> ParseFixed(string fileName, int width, int colCount)
    {
        var fieldArrayList = new List<string[]>();
        using (var tfp = new TextFieldParser(fileName))
        {
            tfp.TextFieldType = FieldType.FixedWidth;
            var fieldWidths = new int[colCount];
            for (int i = 0; i < fieldWidths.Length; i++)
            {
                fieldWidths[i] = width;
            }
            tfp.CommentTokens = new string[] { "$" };
            tfp.FieldWidths = fieldWidths;
            tfp.TrimWhiteSpace = true;
            while (!tfp.EndOfData)
            {
                try
                {
                    fieldArrayList.Add(tfp.ReadFields());
                }
                catch (Microsoft.VisualBasic.FileIO.MalformedLineException ex)
                {
                    Debug.WriteLine(ex.ToString());
                    // parse atypical lines here...?
                    continue;
                }
            }
        }
        return fieldArrayList;
    }

サンプルデータ (見やすくするために [すべての文字を表示] をオンにします)

より多くのサンプルデータ

4

0 に答える 0