2013-03-15 8 views
6

コマンドプロンプトを使用してCSVファイルにSQLクエリをスプールしようとしていますが、返すデータの1列にデータにカンマが含まれています。次の列に進みます。これを回避する方法はありますか?理想的には、この特定の列はクエリの途中で返され、最後には返されません。データにカンマが含まれているときにCSVにSQLをスプールする

私は現在、次のコマンドを使用しています:

set termout off; 
set colsep ','; 
set underline off; 
set feedback off; 
set pagesize 0; 
set linesize 1500; 
set trimspool on; 

Iが設定COLSEPを知っている「」コマンドはしかし問題である、とそれを交換するかを把握することができていません。誰にも何か推奨事項はありますか?

また、私のSQLクエリの直前に、私はヘッダ情報を取得するためにselect文を使用しています。デュアルから 'a、b、c'を選択してください。それが答えに違いを生むかどうかは分かりません。

+0

使用しているSQLのタイプは何ですか?オラクル? – PaulStock

+0

コントロールMでsqlコマンドを実行しているジョブ – user2175401

答えて

1

結果セットを返すクエリを変更するには、その列を二重引用符で囲みます。 bと仮定すると犯人である:

select a 
     , '"' || trim(B) || '"' as b 
     , c 
from your_table; 

適切な構文はもちろん、あなたのRDBMSのバージョンに依存します。

5

2つの潜在的な回答。どちらも完璧ではありません。あなたは結果の一部でコンマ、ないパイプ(|)をお持ちの場合は、

set colsep '|' 

でパイプ区切りに切り替えることができcsvを読むことができるほとんどのソフトウェアは、その形式を持つだけで罰金を行います。これを行うには

"data 1","data 2","data,with,commas" 

、セパレータの意志:

それはあなたのために動作しない場合は、列の中にカンマを治療するためのものを実現することができ、あなたが引用符内のすべてのデータ項目をラップする必要があります

:そうあなたが

set colsep '","' 

これは冒頭で引用符を持っていないと、各行の終わりなので、あなたがしてsedと引用符内のすべての行をラップすることができ","する必要があります

sed 's/^[^$]*$/"&"/' 
+1

値に引用符が含まれていると正しく動作しません。 CSVの引用は二重引用符でエスケープする必要があります。例えば、xyz "a"はxyzにエスケープする必要があります。 "" a "" – summerian

2

あなたはスペースを使用して列のデータからコンマ値を置き換えます

select REPLACE(column_name, ',',' ') column name from table_name 

このようなあなたの選択クエリを変更することができます。

関連する問題