便利技

改行を含む大量のCSVファイルをOracleへ取り込む方法・注意点

※あくまで方法の大枠を紹介する記事です。
細かいコード文法等には触れませんのでご注意ください

<目次>
1.前提
2.データの様式指定
3.取込テーブルを用意する
4.改行のあるデータの取込
5.おわりに

1.前提

・取込み先となるOracle Databaseは作成済み
・Oracleへの取込みにはSQL*Loaderを使用

2.データの様式指定

もし他社からデータを吐き出してもらう場合は、文字コード・区切り文字・囲み文字・ヘッダ行の有無を最低限指定した方がよいでしょう。

区切り文字はカンマ(CSV)かタブ(TSV)、囲み文字はダブルコーテーション(")が一般的だと思います。
ダブルコーテーション無くてもいいんですが、その場合はデータ末尾以外に改行が含まれないようにして注意

数値項目は囲わないでOK。
むしろ囲われちゃうと文字型と区別出来ない(と私は思うのですが、何がスタンダードなんでしょうか)

ファイルの中身のイメージ的はこんな感じです。

3.取込テーブルを用意する

データもらう時に一緒にテーブル定義スクリプトももらえたら一番良いですが、もらえない時もあります!
「クレヨ!」と思いますが、渡す側からしたら自社システムのテーブル定義というのは技術的な資産なので簡単にはいきません。

そんな時はデータを分析するしかないです。

分析の仕方は人それぞれ言語それぞれです。得意なものを使えばいいと思います。
私はExcel+VB.netで、
取込対象リストをExcelで作りつつ、VB.netのTextFieldParserを使ったCSV読込処理を、COMコンポーネントとして呼び出して解析してます。
(TextFieldParserは.NET Framework2.0で追加された機能。もっと早い方法ありそう..)

TextFieldParserでCSVファイルの中身を読み取るんですが、ここではデータの中身を見るだけ。
この時に最大文字数・データ型・改行有無を取得して、この情報から取込テーブルのCreate Table文を作成します。

と、一緒にSQL*Loaderの制御ファイル(コントロール・ファイル)を作成します。

この時にプラスαで私がやっていることは、
最大文字数より少し多めに桁数を取るです。
データの最大文字数というのはデータをもらう時期によって変わるものなので、今回もらったデータがたまたま少ないなんてことも無くは無いです。
テーブル定義をもらえたらそんなことする必要ないんですけどね・・・

4.改行のあるデータの取込

取込みはSQL*LoaderというOracle公式のユーティリティを使います。

しかしここで悲しい問題が1つ。

文字型フィールドに改行コードがあると上手く取り込めない!!!

何のためのダブルコーテーション・・・。

これを解決するには、こちらの記事が大変参考になります。

記事中からダウンロード出来るツールを使って、改行ありのCSVファイルに手を加えてくれます。
そうすることで改行があってもCSVをSQL*Loaderで取り込めます。
株式会社プラムシックス様、助かりましたm(._. )mありがとうございます

改行ありでもデータの件数が多くなければAccessのインポートも手軽でいいんですけどね。
100万行を超えるとか、ファイルサイズ1GB超えるようなのだとAccessでは厳しいです。

5.おわりに

誰かしらの参考になれば嬉しいです。
取り込めてもそこからの変換作業がある場合はまた大変でしょうけど、取込作業を少しでも効率的に出来るといいですね。




-便利技