質問: dbからタブ区切りのcsvデータを抽出する dbからcsvにしてデータを取り出そうと、ネットで検索して みようみまねでやってみました。(下記の場合カンマ区切りですが) タブ区切りで整列したデータを抽出したいのですが、特に、 (4)のように隣合う項目の間がかなり離れていて見えにくい状態で csvファイルが作成されてしまいます。 (1)のように整列した形で、タブ区切りのcsvデータを抽出するには、 どのようにしたら宜しいのでしょうか? (2)、(3)は、試してみた実行ファイルです。 環境は、oracle10g windowsxpです。 (1)目的の結果の表示------------------------------- 653-5689 zm05 田中太郎 yokohamas 4 4 9 097005・・・・・ 以下試してみたbatファイルとsqlで抽出 (2)batファイル---------------------------------- sqlplus abcd/abcd@oracle.host1.ser @abc.sql (3)sqlファイル----------------------------------- set echo off set heading off set termout off set pause off set pagesize 0 set trimspool on set feedback off set colsep "," set term off spool hoge.txt select * from t_jutyu; spool off exit (4)結果--------------------------------- 653-5689 ,zm05 田中太郎 ,yokohamasi 4, 4, , ,9 ,097005 , 1 ,18 , , , , , 0 ,asahi asahi ,08-12-23,08-12-23, ------------------------------------------------まで結果
回答: csv(tsvでも同様)をsql*plusでspoolするのに必須と言えるset文が足らないですね。 set linesize 1000 ライン長を指定しないと、デフォルトでは適当なところで折り返されてしまいます。 1000は1000バイトです。 普通、とりあえず5000くらいにしておきますが、業務要件に則して想定される最大のバイト数を指定してください。 それと、正直、colsep をカンマにしてcsvを作るのはお薦めできません。 (多分、仕事で使っている人は殆どやらないと思います) 面倒くさいけど、カラムを連結する方法が確実です。 ↓ select col1 || chr(9) || col2 || chr(9) || col3 || chr(9)... from t_jutyu; chr(9) はタブです。 また、上記は、カラムがすべて文字列の場合の例です。 数値や日付がある時は明示的にto_charでキャストしてください。 ↓ to_char(数値型カラム) to_char(日付型カラム, 'yyyy-mm-dd hh24:mi:ss')