これは、他サイトのブログに書いていた Delphi Advent Calendar 2019 の 15 日目の記事を、Qiiter向けに書き直したものです。
はじめに
FDBatchMoveをつかったCSVファイルの入出力が思いのほかパフォーマンスが良かった(自作ライブラリ比)ので、纏めてみました。
FDBatchによるCSVファイル入出力
仕様
日本郵便のサイトから住所の郵便番号(CSV形式)のデータを、TFDMemTableに、項目を絞って取り込む処理(1)と、取り込んだTFDMemTableのデータを、CSVファイルに出力する処理(2)について纏めました。
CSV取り込み処理
FDBatchMoveTextReader1が、読み込みCSVの設定、FDBatchMoveDataSetWriter1が、出力先(この場合、FDMemTable1)の設定となる。
FDBatchMove1が、この2つを繋ぐことになる。
住所の郵便番号(CSV形式)は、15項目あるがこのうち7項目(郵便番号と、都道府県名、市区町村名、町域名のカタカナと漢字)を抽出することにする。
まず、事前にFDMemTable1に下記のフィールドを定義する。すべて、string型で、とりあえず余裕を持った長さで設定した。
次に、FDBatchMoveTextReader1の定義を行う。
FileNameプロパティに、住所の郵便番号(CSV形式)で落としたファイル(KEN_ALL.CSVを使いました)を指定します。
プロパティのDataDef内のFiledsを選択し、CSVのフィールドを定義する。
住所の郵便番号(CSV形式)は、15項目あるので、Filedsを15設定する。
取り込むFiledsのみ、きちんと定義した。取り込むデータのみ、DataTypeは、atStringとし、それ以外は、DataTypeは、atOtherにしておく。また、FieldSize、Percisionは、すべて0にしておく。
(FDBatchMoveを選択し、マウス右ボタンでのポップアップメニュー中の”テキスト形式を推測”で、フィールド定義を生成出来るが、意図しない型やサイズが設定されることがあるので、CSVファイルの場合はあまりお勧めしない)
また、DataDefプロパティのRecordFormatプロパティが、rfCommaDoubleQuote(Default値)になっていることを確認する。
FDBatchMoveDataSetWriter1の設定は、DataSetプロパティに、FDMemTable1を設定する。
FDBatchMove1の設定は、Readerプロパティに、FDBatchMoveTextReader1を、Writerプロパティに、FDBatchMoveDataSetWriter1を設定する。この後、Mappingsを開き、下記のように、Readerのフィールドと、Writerのフィールドを紐づける。
(Readerのフィールドと、Writerのフィールドが同名で紐づけられれば、FDBatchMoveを選択し、マウス右ボタンでのポップアップメニュー中の”すべてのマッピングを追加”で、自動で生成も可能)
CSV出力処理
FDMemTable1に、"CSV取り込み処理"で作成したデータを事前に取り込んでいます。
FDBatchMoveDataSetReader1のDataSetに、FDMemTable1を設定。
FDBatchMoveTextWriter1のFileNameに出力先のファイル名を設定。
FDBatchMove1の、ReaderにFDBatchMoveDataSetReader1を、WriterにFDBatchMoveTextWriter1を設定します。
今回は、FDMemTable1の全フィールドを落とすことにするので、Mappingsの定義はなしで行います。
こちらも、IDE上で実行可能です。
ソースで行うのであれば、
FDBatchMove1.Execute;
となります。
おわりに
今回は、DataSetは、TFDMemTableを使っていますが、TFDTableにすることも可能です。
パフォーマンスも魅力ですが、IDE上で実行できるので、データベースのデータをちょっとCSVファイルに落としたい時などに便利だと思います。
<Delphi 10.3 Update 3で作成しています>