20

各レコードの各フィールドが固定幅であるレコードでいっぱいのテキスト ファイルがあります。私の最初のアプローチは、単純に string.Substring() を使用して各レコードを解析することです。より良い方法はありますか?

たとえば、フォーマットは次のように記述できます。

<Field1(8)><Field2(16)><Field3(12)>

2 つのレコードを含むサンプル ファイルは次のようになります。

SomeData0000000000123456SomeMoreData
Data2   0000000000555555MoreData    

Substring() よりもエレガントな方法を見落としていないことを確認したいだけです。


更新: 最終的には、Killersponge が提案したような正規表現を使用しました。

private readonly Regex reLot = new Regex(REGEX_LOT, RegexOptions.Compiled);
const string REGEX_LOT = "^(?<Field1>.{6})" +
                        "(?<Field2>.{16})" +
                        "(?<Field3>.{12})";

次に、以下を使用してフィールドにアクセスします。

Match match = reLot.Match(record);
string field1 = match.Groups["Field1"].Value;
4

7 に答える 7

30

FileHelpersを使用します。

例:

[FixedLengthRecord()] 
public class MyData
{ 
  [FieldFixedLength(8)] 
  public string someData; 

  [FieldFixedLength(16)] 
  public int SomeNumber; 

  [FieldFixedLength(12)] 
  [FieldTrim(TrimMode.Right)]
  public string someMoreData;
}

次に、次のように簡単です。

var engine = new FileHelperEngine<MyData>(); 

// To Read Use: 
var res = engine.ReadFile("FileIn.txt"); 

// To Write Use: 
engine.WriteFile("FileOut.txt", res); 
于 2008-10-02T15:14:29.670 に答える
7

なぜ車輪の再発明をするのですか?Visual Basicのハウツー:固定幅のテキストファイルから読み取る方法に従って、.NETのTextFieldParserクラスを使用します。

于 2012-09-23T04:50:10.907 に答える
7

部分文字列は私にはいいですね。私がすぐに思いつく唯一の欠点は、毎回データをコピーすることを意味することですが、それがボトルネックであることを証明するまで、私はそれについて心配しません. 部分文字列は単純です:)

正規表現を使用して一度にレコード全体を照合し、フィールドをキャプチャすることもできますが、それはやり過ぎだと思います。

于 2008-10-02T14:55:40.183 に答える
2

フィールドを埋めるために行末にスペースが埋め込まれていない場合、部分文字列は、行の残りの部分を計算するために少し手を加えないと機能しません。もちろん、これは最後のフィールドにのみ適用されます:)

于 2008-10-02T15:00:14.913 に答える
1

残念ながら、すぐに使用できる CLR は、これに対して Substring のみを提供します。

CodeProject の誰かが、属性を使用してフィールドを定義するカスタム パーサーを作成しました。

于 2008-10-02T15:17:36.510 に答える
0

いいえ、部分文字列は問題ありません。それがそのためです。

于 2008-10-02T14:55:27.377 に答える
0

固定形式ファイルの ODBC データ ソースを設定し、他のデータベース テーブルと同じようにアクセスできます。これには、ファイル形式に関する特定の知識がコードにコンパイルされないという追加の利点があります。誰かが途中で追加のフィールドを挿入することを決定した運命の日です。

于 2008-10-02T19:26:55.023 に答える