[C#][VB.NET] TextFieldParserで固定長ファイルを読み込む方法

[C#][VB.NET] TextFieldParserで固定長ファイルを読み込む方法

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数での指定はできません。

引用符(“”)に囲まれているかどうか、フィールドの空白をトリムするかどうかもそれぞれ、HasFieldsEnclosedInQuotesTrimWhiteSpace で設定できます。

上のコードではファイルの終端になるまでループして内容を出力しています。ReadFieldsで1行分のデータを読み込んで、フィールドごとに分割して取得しています。

結果を見たところ思った通りに出力されているのが確認できました。

C#カテゴリの最新記事