はじめに
ロード対象のCSVファイルを運用していく中で、全ての列ではなく特定の列にのみ囲み文字が付与されているというケースが出てきた場合を想定した対応方法をご紹介します。
テストデータの例
通常、全ての列に囲み文字がある/ないという場合が殆どかと思いますが、以下の例では、2列目にのみ囲み文字が付与されているテストデータです。
このテストデータを例として手順をご紹介します。
1 2 3 4 |
$ cat sample.csv 123,"あいうえお かきくけこ",ABCDE 456,"株式会社 アシスト",アイウエオ 789,"データベース 技術本部",東京都千代田区 |
テストテーブルの作成
初めにテストテーブルを作成します。
1 2 3 4 5 6 7 8 9 10 11 |
dbadmin=> create table test1 (col1 int, col2 varchar(50), col3 varchar(50)); CREATE TABLE dbadmin=> \d test1 List of Fields by Tables Schema | Table | Column | Type | Size | Default | Not Null | Primary Key | Foreign Key --------+-------+--------+-------------+------+---------+----------+-------------+------------- public | test1 | col1 | int | 8 | | f | f | public | test1 | col2 | varchar(50) | 50 | | f | f | public | test1 | col3 | varchar(50) | 50 | | f | f | (3 rows) |
ロードコマンドの例
作成したテーブルに対して前述のCSVファイルをロードします。構文と実行例は以下のとおりです。
構文
テーブル名の後ろに列名を指定します。その際に、囲み文字が付与されている列名に囲み文字の指定を記述します。
COPY スキーマ名.テーブル名(<列名>, <列名 囲み文字の指定>, <列名>)
FROM ‘CSVファイル名’ DELIMITER ‘区切り文字’;
FROM ‘CSVファイル名’ DELIMITER ‘区切り文字’;
実行例
今回の例の場合、2列目のデータにのみ囲み文字があるため、対応するcol2に対して囲み文字を指定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
dbadmin=> copy test1(col1, col2 enclosed by '"', col3) dbadmin-> from '/home/dbadmin/work/VGS/sample.csv' delimiter ','; Rows Loaded ------------- 3 (1 row) dbadmin=> select * from test1; col1 | col2 | col3 ------+------------------------+---------------- 123 | あいうえお かきくけこ | ABCDE 456 | 株式会社 アシスト | アイウエオ 789 | データベース 技術本部 | 東京都千代田区 (3 rows) |
まとめ
どの列に囲み文字が付与されているのかを明示的に指定することで、例外的な出力フォーマットのCSVファイルもロード処理を実行できます。
このような例外的なケースにも対応できるよう参考になさってください。
参考情報
CSVデータのロード方法http://vertica-tech.ashisuto.co.jp/load-csv/
データロードのまとめ記事
http://vertica-tech.ashisuto.co.jp/load-summary/