[C#] テキストファイルから固定幅レコードを読み込む


Answers

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); 
Question

私は各レコードの各フィールドが固定幅であるレコードでいっぱいのテキストファイルを持っています。 私の最初のアプローチは、単純に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;



あなたは、行の終わりにフィールドを埋めるために空白が埋め込まれていない場合、あなたの部分文字列は、そこにどれだけ多くの行を読み上げるべきかを検討するためにちょっとした手間をかけずには動作しません。 これはもちろん、最後のフィールドにのみ適用されます:)