Come dati di uscita da iSQL a intestazioni _with_ file CSV?
-
08-10-2019 - |
Domanda
Sto cercando di interrogare un database Sybase ASA 8 con il cliente iSQL ed esportare i risultati della query in un file di testo in formato CSV. Tuttavia i titoli delle colonne non vengono esportate nel file. Non esiste alcuna opzione speciale per specificare che, né nelle impostazioni isql né nella dichiarazione OUTPUT.
La query e di uscita sembra dichiarazione come questa:
SELECT * FROM SomeTable;
OUTPUT TO 'C:\temp\sometable.csv' FORMAT ASCII DELIMITED BY ';' QUOTE ''
Il risultato è un file come
1;Miller;Steve;1980-06-28
2;Jones;Martha;1965-11-02
3;Waters;Richard;1979-10-15
mentre mi piacerebbe avere
ID;LASTNAME;FIRSTNAME;DOB
1;Miller;Steve;1980-06-28
2;Jones;Martha;1965-11-02
3;Waters;Richard;1979-10-15
Eventuali suggerimenti?
Soluzione
I avrebbe suggerito di iniziare con un'altra dichiarazione:
SELECT 'ID;LASTNAME;FIRSTNAME;DOB' FROM dummy;
OUTPUT TO 'C:\\temp\\sometable.csv' FORMAT ASCII DELIMITED BY ';' QUOTE '';
e aggiungere l'opzione APPEND
su vostra richiesta ... ma non riesco a ottenere APPEND
al lavoro (ma sto utilizzando un motore di ASA 11).
Altri suggerimenti
Prova questo
SELECT 'ID','LASTNAME','FIRSTNAME','DOB' union
SELECT string(ID),LASTNAME,FIRSTNAME,DOB FROM SomeTable;
OUTPUT TO 'C:\\temp\\sometable.csv' FORMAT ASCII DELIMITED BY ';' QUOTE '';
È sufficiente aggiungere l'opzione
WITH COLUMN NAMES
per la sua dichiarazione e aggiunge una riga di intestazione con i nomi delle colonne.
La dichiarazione completa è quindi:
SELECT * FROM SomeTable; OUTPUT TO 'C:\temp\sometable.csv' FORMAT ASCII DELIMITED BY ';' QUOTE '' WITH COLUMN NAMES
si ha già familiarità con le opzioni di output. Non esiste alcuna opzione che ti dà ciò che si desidera.
Ok, il problema è la fine ricevente non accetta i file CSV standard, ha bisogno di punti e virgola.
Se siete scripting, allora siete meglio ottenere l'output nel formato che più si avvicina a quello che ti serve, e quindi awk-ing il file di output. Molto veloce e si può cambiare tutto il necessario. Credo che la soluzione migliore è ASCII o di default formato di output, che fornirà virgola (non due punti) Valori separati, in un file di testo di caratteri ASCII, e comprende intestazioni delle colonne. Quindi utilizzare un singolo comando awk per convertire le virgole per punti e virgola.
isql -S<Server> -D<Database>-U<UserName> -s \; -P<password>\$\1 -w 10000 -iname.sql > output.csv
Se si utilizza l'opzione FORMAT EXCEL
, è uscita saranno le righe con il nome di colonna in prima fila. Poi, una volta che si ottiene in Excel è possibile salvarlo in un altro formato, se è necessario.
SELECT * FROM SOMETABLE;
OUTPUT TO 'C:\temp\sometable.xls' FORMAT EXCEL DELIMITED BY ';' QUOTE ''
Trovato una soluzione più facile, Luogo le intestazioni in un unico file diciamo header.txt (conterrà una sola riga "col_1 | col_2 | col_3"), poi unire il file di intestazione e la corsa del file di output:
cat header.txt my_table.txt > my_table_wth_head.txt
Sono in grado di utilizzare il comando isql
all'output CSV citato.
Esempio
$ isql $DATABASE $USERNAME $PASSWORD -b -d, -q -c
select username, fullname from users
dà il risultato:
username,fullname
"jdoe","Jane Doe"
"msmith","Mark Smith"
bandiere della riga di comando
-b
: Esegui isql in modalità batch non interattivo. In questa modalità, l'isql elabora standard input, prevedendo uno comando SQL per riga.
-dDELIMITER
:. Delimita colonne con delimitatore
-c
: Output i nomi delle colonne in prima fila. Ha qualche effetto solo con le opzioni -d o -x.
-q
:. Avvolgere i campi di caratteri tra virgolette
Sfuggire Problema
si potrebbe incorrere in problemi se i risultati della query contengono virgolette, però. Le citazioni non sono sfuggiti correttamente, in modo che si traducono in CSV valido:
> select 'string","with"quotes' as quoted_string
quoted_string
"string","with"quotes"