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

便利技

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

目次

スポンサードリンク

1.前提

・取り込み先のデータベース管理システム(DBMS)は、Oracle Database
・データ提供元のデータベース管理システム(DBMS)は、Oracle Database以外
 (同じOracleならdmpでもらえばこの記事で書くような面倒なことしなくて済みます)
・取り込み先のデータベースは作成済み(CREATE DATABASE済み)として話を進めます
・データベースへの取込みにはOracle公式のユーティリティ「SQL*Loader」を使用

2.データの様式指定

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

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

※改行を含むファイルを取り込みたい場合は、4.改行のあるデータの取込の方法をご参照ください。

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

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

データ提供元からテーブル定義書をもらって、それを元に桁数や型などを定義します。

ただこのとき、データ提供元からテーブル定義書を一緒にもらえたら一番良いのですが、もらえない時もあります。
そこは「いや、くれよ」と思うかもしれませんが、提供元からしたら自社システムのテーブル定義というのは技術的な資産なので、簡単に渡せません。

そうなった場合、実データを分析して型を推測するしかないです。
分析の仕方は人それぞれ/言語それぞれです。得意なものを使えばいいと思います。

例として、私が取った方法は、Excel VBA + VB.netです。概要を以下にまとめておきます。

●読み込むファイルのパスをExcelでリスト化したものを用意
●VBAで上記ファイルリストをforで回す
●for内で、VB.netのCOMコンポーネントを呼び出す処理を書く
●VB.netでCOMコンポーネントを作成(Visual Studioのテンプレートにあるはずです)
●VB.netで、TextFieldParser(NET Framework2.0で追加された機能)の機能を使い、CSVファイルを読み込む
●読み込んだら、全データを回して各列の最大文字数・データ型・改行有無を調べる
●その結果をVBAに返す
●VB.net側から受け取った最大文字数・データ型・改行有無情報を元に、VBAでCreate Table文を作成。セットでSQL*Loaderの制御ファイル(コントロール・ファイル)も作成
●上記Create Table文を流して、テーブルを作成。SQL*Loaderで取り込み

詳細は省いてやるべきことのみ書いています。わかりづらくてすいません。

補足として、
VB.netで読み込んだデータの最大文字数を調べると書きましたが、調べた桁数より少し大きめの値を返すようにしておいた方がいいと思います。
どういうことかと言うと、ある列の最大桁数が13桁だったとします。そしたら実際に定義する列のサイズは20桁ぐらいにしておく、ということです。

データの最大桁数というのは、データをもらう時期によって変わるからです。
例えば小売店で年末が一番の売上になる場合、1月〜11月の売上データだけではデータの最大桁数は測れないということです。

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

SQL*Loaderで改行のあるデータを取り込む場合、少し手間がかかります。
どうするかというと、こちらの記事に書かれていることを実行します。

文字列に改行を含むCSVのロード(株式会社プラムシックス)

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

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

5.おわりに

大まかな解説しかしていないためわかりづらかったかもしれませんが、誰かしらの参考になれば幸いです。

スポンサードリンク

ITリテラシー・プログラミングのまとめ記事