2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

FDBatchでCSVファイル入出力

Posted at

これは、他サイトのブログに書いていた Delphi Advent Calendar 2019 の 15 日目の記事を、Qiiter向けに書き直したものです。

はじめに

FDBatchMoveをつかったCSVファイルの入出力が思いのほかパフォーマンスが良かった(自作ライブラリ比)ので、纏めてみました。

FDBatchによるCSVファイル入出力

仕様

日本郵便のサイトから住所の郵便番号(CSV形式)のデータを、TFDMemTableに、項目を絞って取り込む処理(1)と、取り込んだTFDMemTableのデータを、CSVファイルに出力する処理(2)について纏めました。

CSV取り込み処理

使うコンポーネントは、下記になります。
image.png

FDBatchMoveTextReader1が、読み込みCSVの設定、FDBatchMoveDataSetWriter1が、出力先(この場合、FDMemTable1)の設定となる。
FDBatchMove1が、この2つを繋ぐことになる。
住所の郵便番号(CSV形式)は、15項目あるがこのうち7項目(郵便番号と、都道府県名、市区町村名、町域名のカタカナと漢字)を抽出することにする。
まず、事前にFDMemTable1に下記のフィールドを定義する。すべて、string型で、とりあえず余裕を持った長さで設定した。
image.png

次に、FDBatchMoveTextReader1の定義を行う。
FileNameプロパティに、住所の郵便番号(CSV形式)で落としたファイル(KEN_ALL.CSVを使いました)を指定します。
プロパティのDataDef内のFiledsを選択し、CSVのフィールドを定義する。
image.png

住所の郵便番号(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を選択し、マウス右ボタンでのポップアップメニュー中の”すべてのマッピングを追加”で、自動で生成も可能)
image.png

CSV出力処理

使うコンポーネントは、下記になります。
image.png

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で作成しています>

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?