TextFieldParserで固定長ファイルを読み込む方法
TextFieldParserでCSV(TSV)を読み込む方法をまとめたのですが、TextFieldParserで固定長ファイルも簡単に扱うことができます。
TextFieldParserクラスの使い方
サンプルデータとして以下の固定長ファイルを読み込んで処理するサンプルをC#,VB.NETそれぞれで用意しました。テスト用のデータはフィールドの長さがそれぞれ5、10、10です。
参照の追加
TextFieldParserクラスはMicrosoft.VisualBasic.FileIO名前空間にあるので、まずはMicrosoft.VisualBasicアセンブリへの参照を追加しておきます。
固定長テストデータ
C:\work\test.txt
1 abc 10000
2 def あいうえお
3 ghiかきくけこさしすせそ
C#
using System;
using System.Text;
using Microsoft.VisualBasic.FileIO;
namespace Parser
{
class Program
{
static void Main(string[] args)
{
var parser = new TextFieldParser(@"C:\work\test.txt",
Encoding.GetEncoding("UTF-8"));
using (parser)
{
// 固定長区切りの設定
parser.TextFieldType = FieldType.FixedWidth;
// 各フィールの長さを指定
parser.FieldWidths = new int[] { 5, 10, 10 };
// フィールドの空白トリム設定
parser.TrimWhiteSpace = false;
// ファイルの終端までループ
while (!parser.EndOfData)
{
// フィールドを読込
string[] row = parser.ReadFields();
foreach (string field in row)
{
Console.WriteLine(field);
}
Console.WriteLine();
}
}
Console.ReadKey();
}
}
}
VB.NET
Imports System.Text
Imports Microsoft.VisualBasic.FileIO
Module Module1
Sub Main()
Using parser As New TextFieldParser("C:\work\test.txt",
Encoding.GetEncoding("UTF-8"))
' 固定長区切りの設定
parser.TextFieldType = FieldType.FixedWidth
' 各フィールの長さを指定
parser.FieldWidths = New Integer() {5, 10, 10}
' フィールドの空白トリム設定
parser.TrimWhiteSpace = False
' ファイルの終端までループ
While Not parser.EndOfData
' フィールドを読込
Dim row As String() = parser.ReadFields()
For Each field As String In row
Console.WriteLine(field)
Next
Console.WriteLine()
End While
End Using
Console.ReadKey()
End Sub
End Module
出力結果
上のサンプルの実行結果は次のとおりになります。
1
abc
10000
2
def
あいうえお
3
ghi
かきくけこさしすせそ
解説
まず、TextFieldParserクラスのインスタンスを作成します。コンストラクタの引数でファイルのパスとエンコードを指定します。
次に、TextFieldParserクラスのプロパティでファイルを読み込むための設定を行います。固定長のファイルなので、TextFieldTypeでFieldType.FixedWidthを指定します。各フィールドの長さを、FieldType.FieldWidthsで指定します。ここで指定するフィールド長は文字数であり、Byte数での指定はできません。
引用符(“”)に囲まれているかどうか、フィールドの空白をトリムするかどうかもそれぞれ、HasFieldsEnclosedInQuotes、TrimWhiteSpace で設定できます。
上のコードではファイルの終端になるまでループして内容を出力しています。ReadFieldsで1行分のデータを読み込んで、フィールドごとに分割して取得しています。
結果を見たところ思った通りに出力されているのが確認できました。
コメントを書く