[pgsql-jp: 37081] Re: COPY コマンドによるDATE型インポート時のエラー

M.Oho oho @ software.sanix.jp
2006年 5月 22日 (月) 20:52:35 JST


お世話になっております。大穂です。

池内様、ご助言ありがとうございます。

> copy to で書き出した結果を copy from で読み込める
というのを手がかりにいろいろと試してみたところ、

"a","2006/05/22"
"b",""
    ↓
a,2006/05/22
b,

のように取込元のCSVファイルをダブルクォーテーション(")
で括らないように変換してCOPYコマンドを発行すればインポート
できることが分かりました。

ただし、以下のようなテーブルがあった時に
         Table "public.test"
  Column |     Type                 | Modifiers
 --------+--------------------------+-----------
  id     | character(1)             |
  name   | character varying(50)   |
  time   | date                     |

このようなデータをインポートしようとすれば
"a","あああ","2006/05/22"
"b","いいい,ううう",""
     ~~~~~~~~~~~~~    
変換時、下記のようになってしまい
a,あああ,2006/05/22
b,いいい,ううう,
  ~~~~~~ ~~~~~~
正常にインポートできませんでした。
(文字列中のカンマを区切り文字とみなしてしまうため)


そこで、【""】となっている部分だけを削除するように
変換してインポートするようにしましたところうまくい
きました。


現時点ではこの方法で開発を進めていこうと思っており
ますが、こんな方法で良いのかという不安も少々ありま
す。(正攻法ではないような。。。)

また、何かいいアイディアがあればご教授お願い致します。

以上です。

> 池内と申します。
> 
> 直接の解答では無いですが、こちらで実験した結果です。
> copy to で書き出した結果を copy from で読み込めるので、それが手がかりに
> ならないでしょうか?
> 
> PostgreSQL 8.0.2 on Linux(Vine 3.1/Kernel2.6.11.8)
> 
> test=# \d test
>         Table "public.test"
>  Column |     Type     | Modifiers
> --------+--------------+-----------
>  id     | character(1) |
>  time   | date         |
> 
> test=# insert into test values ('b',NULL);
> INSERT 1514273 1
> test=# select * from test;
>  id |    time
> ----+------------
>  a  | 2006-05-22
>  b  |
> (2 rows)
> 
> test=# copy test to '/tmp/doya.txt' using delimiters ',' 
> with CSV QUOTE AS '"';
> COPY
> 
> test=# copy test from '/tmp/doya.txt' using delimiters ','
> with CSV QUOTE AS '"' ;
> COPY
> 

> > お世話になります。
> > 大穂と申します。
> > 
> > COPYコマンドによりCSVデータをインポートしようとしております。
> > Date型の項目にNULL値をインポートしようとした際、以下のような
> > エラーが発生します。
> > 
> > ERROR:  invalid input syntax for type date: ""
> > CONTEXT:  COPY test, line 2, column time: ""
> 
> --

> 





pgsql-jp メーリングリストの案内