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?

È stato utile?

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

Sybase documentazione .

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

( copiato dalla pagina man )

-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"
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top