DBからタブ区切りのCSVデータを抽出する方法

このQ&Aのポイント
  • DBからタブ区切りのCSVデータを抽出する方法について解説します。
  • DBからCSVに変換してデータを抽出する方法を試してみました。
  • 特に隣接する項目の間が離れて表示されるCSVファイルについても対策を提案します。
回答を見る
  • ベストアンサー

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, ------------------------------------------------まで結果

  • Oracle
  • 回答数2
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • utakataXEX
  • ベストアンサー率69% (711/1018)
回答No.2

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')

jjmmyy
質問者

お礼

ありがとうございます。参考にさせて頂き、途中で何度かスペースが引っかかってエラーになりましたが、何とか目的を果たすことができました。

その他の回答 (1)

  • SaKaKashi
  • ベストアンサー率24% (755/3136)
回答No.1

set lines 30000 を追加してください。 TAB区切りの場合には複数行の縦位置はそろいませんけど。

関連するQ&A

  • [SQL Server] コマンドプロンプトからのCSV形式出力

    SQL ServerのテーブルデータをSELECTしてダブルコーテ区切りのCSVに出力したいと考えております。 ・batファイルからの起動を希望。 ・出力CSVファイル名はbatファイルより引数で指定したい。 ・出力後、DELETEも行いたい。 OracleだとSQL*Plus環境で下記のようにテキストレベルで簡単にできます。 SQL Serverでも同様のことができないでしょうか? 要は下記をSQL Server版でやりたいということです。 参考:Oracleだと・・・ 同一dirに、abc.batとabc.sqlを用意しabc.batを実行すると20070601.csvが生成される。 1.abc.bat rem ----abc.bat-ここから---- sqlplus usr/pwd@host @abc.sql 20070601.csv rem ----abc.bat-ここまで---- 2.abc.sql ----ファイル名=abc.sql-ここから--- set echo off set heading off SET VERIFY OFF set FEEDBACK OFF set TRIMSPOOL on set termout off set pagesize 0 set linesize 32767 spool &1 select '"'|| カラム1 ||'",'|| '"'|| カラム2 ||'",'|| '"'|| カラム3 ||'"' from テーブル1; spool off delete from テーブル1; exit ----ファイル名=abc.sql-ここまで--- 20070601.csv結果 -ファイル名=20070601.csv-ここから--- "20060726","scott","356160" "20060727","tiger","463391" "20060728","manager","1930" -ファイル名=20070601.csv-ここまで--- DBサーバ環境 OS:Win2003SvrR2 SQL Serverバージョン:わかりません。(2003にのってるので最近のだと思われます) Oracle経験者でSQLServer初心者です。マニュアルもなく、Web検索しても「SQL」「Server」ってなかなかうまくひっかからない!! ので質問あげさせていただきます。

  • batでsqlplusによる前月データを取得

    sqlplusにてbatファイルを起動するだけで前月のデータを取得しようとしていますが、 ネットで検索等してもなかなかうまく行きません。 以下のようにbatファイルを起動すると、常に前月のT_URIのデータを取得させたいのですが、 どのようにすれば宜しいでしょうか?ご教示頂けると助かります。(期間の日付をじかに入力すれば、取得できたのですが、同じように取得したいテーブルが複数あるので) 月初日は常に1日、月末日は常に31日にして、前月をbatファイルかsqlファイル上で計算させる方法はないのでしょうか? (会社の業務でoracleのデータベースから抜き出そうとしています。) SQLPLUS ABCD/ABCD@ORACLE.XYZ.WW @0031_ymd.sql PAUSE ↓0031_ymd.sql set heading on set echo off set underline off set termout off set pause off set pagesize 0 set trimspool on set feedback off set termout off set linesize 1000 set lines 30000 spool D:\hoge.csv SELECT * FROM T_URI S WHERE AND S.KJN_YMD >= yyyymmdd AND S.KJN_YMD <= yyyymmdd

  • CSV出力スクリプトについて

    CSV出力のスクリプトを作成しました。 単純に1つのテーブルをそのままCSVで出力するだけです。 件数は60万件程度です。 問題は13,4件に1行改行されてしまいます。 この改行を省くことができるでしょうか? --CSV出力 -- set line 100 -- set echo off コマンド表示を抑止する -- set termout off 画面出力を抑止する -- set heading off 列タイトルの表示を抑止する -- set feedback off 結果メッセージの表示を抑止する -- set colsep ',' 列と列の区切りをカンマ(,)にする set line 100 set echo off set termout off set heading off set feedback off set colsep ',' /* spoolコマンドでファイル出力を開始する */ spool C:\tmp\sample.csv /* 問い合わせ結果がファイルtest.csvに出力される */ SELECT KAIIN_NO, STS_NO, SYOHIN_NO FROM SAMPLE; /* spool offでファイル出力を終了する */ spool off

  • CSV出力スクリプトについて

    CSV出力のスクリプトを作成しました。 単純に1つのテーブルをそのままCSVで出力するだけです。 件数は60万件程度です。 問題はたとえばKAIIN_NOの項目が桁数20桁の場合に出力されるCSVが20桁を超えて50桁くらいで出力されたりします。項目桁数と同じではなくてもよいのですが、空白を出力したくないです。 なにかよい方法はありますでしょうか? ※Select文でTrimをかけても効果はありませんでした。 --CSV出力 -- set line 100 -- set echo off コマンド表示を抑止する -- set termout off 画面出力を抑止する -- set heading off 列タイトルの表示を抑止する -- set feedback off 結果メッセージの表示を抑止する -- set colsep ',' 列と列の区切りをカンマ(,)にする set line 100 set echo off set termout off set heading off set feedback off set colsep ',' /* spoolコマンドでファイル出力を開始する */ spool C:\tmp\sample.csv /* 問い合わせ結果がファイルtest.csvに出力される */ SELECT KAIIN_NO, STS_NO, SYOHIN_NO FROM SAMPLE; /* spool offでファイル出力を終了する */ spool off

  • BAT処理でCSVデータのインポート

    よろしくお願いしますm(__)m 昨日から調べて作ってみたのですがうまく動かず、 MYSQLが強制終了してしまうこともありました(T_T) 疲れました・・・ ※test.batに以下の内容を書きました c:\mysql\bin\mysql -u **** -p**** < test.sql ※test.sqlに以下の内容を書きました LOAD DATA INFILE "c:\mysql\test.csv" INTO TABLE 商品管理.商品単品 FIELDS TERMINATED BY "," OPTIONALLY ENCLOSED BY "" ESCAPED BY "\\" LINES STARTING BY "" TERMINATED BY "\n" ※test.csvはカンマ区切りになっています。 ファイルは【test.bat】【test.sql】【test.csv】とも c:\mysqlに置いています。 この状態でtest.batを実行するとDOS窓が一瞬現れて消えて しまいます。 間違っているところやヒントなどあれば教えてくださいm(__)m

    • ベストアンサー
    • MySQL
  • テーブルレイアウトの差異

    SQL*Plusでテーブルの構造を表示するDESCを使って、結果をSPOOLする際に csvファイルにしたいと思い SET HEADING OFF SET COLSEP "," SPOOL C:\WINDOWS\デスクトップ\スプール結果.txt DESC テーブル名 SPOOL OFF と実行してもカンマ区切りにならないのですが、DESCのときは出来ないのですか? Oracle for Windows 95のSQL*Plus Ver3.3.3.0.0を使用しています。 また、テーブルの構造の差異を見つける作業を行ないたいのですが、 効率の良い方法もしくはフリーソフトをご存知の方情報お願いします。 この質問がメインかな?

  • ExcelVBAにて外部データ(*.csv)をSQL文を使って抽出する方法

    こんにちは VBAインポート問題で日々悩んでいるものです。 CSV形式のデータをODBCのシステムDSNに登録し、それをDAOでSQL要求しデータを抽出する方法がよくわかりません。 (1)データベースの定義記述内容 (2)レコードセットにSQL命令をかける記述 (3)抽出された内容をワークシートに貼る記述 等がよくわかりません。 DAOの場合、レコードセットを定義するのに set DB=DBEngine.OpenDatabase("******")があったり、なかったりする理由がわかりません。 突然、set rs = CurrentDb.OpenRecordset("*****") しているのはなぜでしょうか。

  • SQL*PLUSに関して

    標記の件に関しまして 私はデータベースに関する知識は全く無いのですが SEが私のクライアントに設定した SQL*PLUSを使用してた売上データベースからのデータの抽出 機能がありまして これとは違う条件でのデータ抽出が必要となり 何とかSQL文を部分的に加工して目的が達成できるかどうか 調べているところであります。 ■疑問点■ SQL*PLUSのコマンドファイルは既に作成されていて @~でメモ帳ファイルに記述されているSQL文を 指定すればSPOOLでデータが別のテキストファイルに 抽出されるようになっているようです。 この場合に 既存のSQL文が記述されているメモ帳ファイルの抽出条件を 加工してコマンドにて加工後のファイルを@~で実行すれば 必要としているデータを抽出することができるでしょうか? あと 現在使用しているSQLで下記の部分が共通して記述されて いるのですがこれはどういった意味でしょうか。 SET ECHO OFF SET HEADING OFF SET PAGESIZE 0 SET FEEDBACK OFF SET LINESIZE 30000 SET TRIMSPOOL ON SPOOL C:ファイルの場所 ■ここに抽出条件があるようです。■ SPOOL OFF EXIT 0; 大変申し訳ございませんが 現在はSEから購入したシステムから紙ベースで 出力して手作業で入力を行っているため 何とかデータベースから直接抽出できないか 模索しているところであります。 アドバイス頂けますでしょうか。 宜しくお願いします。

  • SQLについてアドバイスください。

    USER_TAB_COLUMNSから入力したテーブル名で構造を抽出し SQL文を作成出来るものを作ろうとしています。 80%までうまく行くのですが、SELECT文でフィールドをカンマ付けで置いていく 所で最後のフィールドに来た時カンマが付加されてしまいます。 これを最後のフィールドに来た時カンマが付加されないでスペースで置くように したいのですが。。 set pagesize 0 set linesize 1000 set trimspool on set feedback off set verify off ACCEPT TABLE CHAR PROMPT 'TABLE NAME:' set termout off spool C:\TEST_csv.sql SELECT 'SELECT ' FROM DUAL; SELECT COLUMN_NAME || ',' FROM USER_TAB_COLUMNS WHERE TABLE_NAME = UPPER( '&TABLE' ) ORDER BY COLUMN_ID; SELECT 'FROM DUAL' FROM DUAL; SPOOL OFF

  • sqlplusでヘッダーが付かない

    サーバー:windows 2003server oracle10g クライアント:windows xp oracle10g 以下のsqlファイルをbatで起動し、テキストファイルを出力しています。 しかしながら、setのところにヘーダーを出力するよう宣言しているのに もかかわらず、出力されません。 どなたかおわかりになる方、いらっしゃいませんでしょうか? set echo off set heading on set underline off set termout off set pause off set pagesize 0 set trimspool on set feedback off set termout off set linesize 1000 set lines 30000 spool hoge.txt select aaa||CHR(9)|| bbb||CHR(9)|| ccc||CHR(9)|| ddd from M_JITU; spool off EXIT