2013-03-15 12 views
6

Ich versuche, eine SQL-Abfrage über eine Eingabeaufforderung in eine CSV-Datei zu spoolen, jedoch eine Spalte der Daten, die ich zurückgebe, enthält Komma in den Daten und verursacht die Daten Geh in die nächste Spalte. Gibt es eine Möglichkeit, dies zu umgehen? Im Idealfall möchte ich, dass diese bestimmte Spalte in der Mitte der Abfrage zurückgegeben wird, nicht am Ende.Spooling sql zu einer CSV, wenn Daten Kommata enthält

verwende ich zur Zeit der folgenden Befehle:

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

Ich kenne den Satz colsep ‚‘ Befehl aber das Problem ist, nicht in der Lage, herauszufinden, was es mit zu ersetzen. Hat jemand irgendwelche Empfehlungen?

Auch, direkt vor meiner SQL-Abfrage, verwende ich eine Select-Anweisung, um die Header-Informationen zu ziehen. Wählen Sie "a, b, c" aus dual; Nicht sicher, ob das in der Antwort einen Unterschied macht oder nicht.

+0

Welche Art von SQL benutzen Sie? Orakel? – PaulStock

+0

Ausführen der SQL über einen Befehlsjob in Control M – user2175401

Antwort

1

Sie können Ihre Abfrage ändern, die die Ergebnismenge zurückgibt, indem Sie diese Spalte mit doppelten Anführungszeichen umgeben. Unter der Annahme, b ist der Täter:

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

richtige Syntax auf Ihrer RDBMS Version hängt natürlich.

5

Zwei mögliche Antworten. Keiner von beiden ist perfekt. Wenn Sie Kommas in einige der Ergebnisse, aber keine Rohrleitungen (|), könnten Sie mit einem Rohr-getrennte Schalter mit

set colsep '|' 

Die meisten Software, die csv mit diesem Format nur gut tun lesen kann.

Wenn das nicht für Sie arbeiten, können Sie erkennen, dass Kommas innerhalb einer Spalte zu behandeln, werden Sie jedes Datenfeld in Anführungszeichen wickeln müssen:

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

dies zu tun, wird jeder Separator müssen "," sein, so können Sie

set colsep '","' 

Dies wird nicht Anführungszeichen am Anfang haben und jeder Zeile endet, so können Sie dann jede Zeile in Anführungszeichen mit sed wickeln:

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

Dies funktioniert nicht ordnungsgemäß, wenn Werte Anführungszeichen enthalten. Anführungszeichen in CSV müssen mit Anführungszeichen versehen werden. Zum Beispiel muss xyz "a" in xyz "a" maskiert werden. – summerian

2

Sie können Ihre Auswahlabfrage wie

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

Dies wird durch Komma Wert von Ihren Spaltendaten mit Platz ersetzen ändern.