2014-04-01 21 views
18

ich eine MySQL-Tabelle haben, die als CSV-Datei werden muss herausgenommen, die Abfrage verwendet iexportieren MySQL-Tabelle in eine CSV-Datei

SELECT "ID","NAME","SALARY","SAL1","SAL2","SAL3","SAL4","SAL5","SAL6","SAL7","SAL8","SAL9","SAL10","SAL11","SAL12","SAL13","SAL14","SAL15","SAL16","SAL17","SAL18","SAL19","SAL20","SAL21","SAL22","SAL23","SAL24","SAL25","SAL26" 
UNION ALL 
SELECT * 
FROM addstock25 
INTO OUTFILE "E:\\JOSE DATA\\addstock7.csv" 
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"' 
LINES TERMINATED BY '\n 

Diese Abfrage funktioniert, was, wenn ich eine 200 Spaltennamen ? Gibt es eine Möglichkeit, es ohne manuelle Eingabe zu tun?

+1

mögliches Duplikat von [MySQL-Dump in CSV-Textdateien mit Spaltennamen oben?] (Http://stackoverflow.com/questions/4589891/mysql-dump-into-csv-text-files-with-column- names-at-the-top) –

+0

mysqldump mit --tab sollte hier der einfache Weg sein ohne zusätzliche Skriptanforderungen. Ich schrieb [3 Möglichkeiten, MySQL in CSV zu konvertieren] (http://kedar.nitty-witty.com/blog/export-mysql-database-table-to-csv-limited-excel-file) im Detail. –

Antwort

4

Streifen Sie die erste Spalte und den ersten 3 Eintrag dieser Spalte ab (hängt von Ihrer Verwendung ab). Sie erhalten die Liste der Felder in addstock25.

Dies bringt nur Feldnamen über virtuelle Tabellen, die im Kern abgeleitet sind ... Informationsschema genannt.

SELECT `COLUMN_NAME` 
FROM `INFORMATION_SCHEMA`.`COLUMNS` 
WHERE `TABLE_NAME`='foo'; 

Lets sagen Name dieser Abfrage sq_fieldnamelist wäre

So obigen Tabelle haben eine Spalte, und es hat die Feldnamen von th "foo" Tabelle.

Wenn schreibt direkt wie dieser

SELECT (sq_fieldnamelist) 
    UNION ALL 
    SELECT * 
    FROM addstock25 
    INTO OUTFILE "E:\\JOSE DATA\\addstock7.csv" 
    FIELDS TERMINATED BY ',' 
    ENCLOSED BY '"' 
    LINES TERMINATED BY '\n 

Mysql einen Fehler geben. "Unterabfrage gibt mehrere Zeilen zurück"

Wir müssen sq_fieldnamelist bearbeiten, um alle Einträge, die durch Kommas getrennt sind, zu verbinden.

Select GROUP_CONCAT(COLUMN_NAME) 
FROM 
(SELECT `COLUMN_NAME` 
FROM `INFORMATION_SCHEMA`.`COLUMNS` 
WHERE `TABLE_NAME`='ffd_companies' 
LIMIT 3,100 
) AS fafa 
GROUP BY 'COLUMN_NAME' // this group by is just to make group concat work 

Nehmen wir diese sq_fieldnamelist2 ist

Wenn wir sq_fieldnamelist wie diese bearbeiten. Es gibt nur einen Wert zurück, bei dem es sich um Feldnamen handelt, die durch Kommas getrennt sind. Jetzt können wir diese Unterabfrage in Ihre select-Anweisung aufnehmen, um benötigte Felder zu erhalten.

Sie müssen LIMIT 3,100 in sq_fieldnamelist2 für Ihren eigenen Zweck bearbeiten

sagen wir Ihre Tabelle ist wie fil1, fil2 ... filN, sal1, sal2, sal3 ...., salI, um die einzigen Gehaltsfelder zu sehen, die Sie verwenden sollten LIMIT N,x>I+N. wenn Sie die Nutzung LIMIT 0,x>N+I

+0

Ich könnte nicht verstehen, was Sie erklären .... Was ich will, ist die CSV-Datei aus MySQL mit Spaltennamen in der ersten Zeile exportiert. – user3304713

+0

gibt Ihnen eine Möglichkeit, Col-Namen zu kopieren - ein wenig automatisch – tgkprog

+0

keine andere Möglichkeit, das zu tun? – user3304713

2

sehen wollen, ich sehe nicht, warum Sie nicht

SELECT * 
FROM addstock25 
INTO OUTFILE "E:\\JOSE DATA\\addstock7.csv" 
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"' 
LINES TERMINATED BY '\n 

tun kann?

+2

Wenn ich das tun, bekomme ich nicht die Spaltennamen ... Ich habe 200 Spalten, also wie kann ich es mit Spaltennamen exportieren? – user3304713

1

Ich denke, dass Sie nach etwas ähnlichem suchen.

SET @sql = NULL; 
     SELECT GROUP_CONCAT("'",COLUMN_NAME,"'") 
      FROM 
     (SELECT `COLUMN_NAME` 
     FROM `INFORMATION_SCHEMA`.`COLUMNS` 
     WHERE `TABLE_SCHEMA` = 'yourdatabasename' 
     and `TABLE_NAME`='ffd_companies' 
     ) AS colnames 
     GROUP BY 'COLUMN_NAME' 
     into @sql; 

     SET @sql = concat ("SELECT", @sql, " from dual 
     UNION ALL 
     SELECT * 
     FROM addstock25 
     INTO OUTFILE 'E:\\JOSE DATA\\addstock7.csv' 
     FIELDS TERMINATED BY ',' 
     ENCLOSED BY '", '"',"' 
     )" 
     ); 

     PREPARE stmt FROM @sql; 
     EXECUTE stmt; 
     DEALLOCATE PREPARE stmt; 

Hoffe das hilft Ihnen.

Hinweis: i hinzufügen, die WHERE-Klausel TABLE_SCHEMA = ‚yourdatabasename‘

+0

Es gibt eine Fehlermeldung .... Ich änderte den Namen der Datenbank .... Irgendwelche anderen Änderungen vorgenommen werden? – user3304713

+0

Irgendeine Idee, was möglicherweise schief geht – user3304713

+0

Bitte tray dies und tel mir wenn es funktioniert. SET @sql = NULL; SELECT GROUP_CONCAT (" '", COLUMN_NAME, "'") FROM ( SELECT 'COLUMN_NAME' FROM' INFORMATION_SCHEMA'.'COLUMNS' WHERE 'TABLE_SCHEMA' = 'yourdatabase' UND' table_name' = 'ffd_companies ') AS Spaltennamen GROUP BY' COLUMN_NAME 'IN @ sql; SET @sql = concat ("SELECT", @sql "von dual union all ( SELECT * ab ffd_companies )" ); VORBEREITEN stmt FROM @sql; AUSFÜHREN stmt; DEALLOCATE VORBEREITEN stmt; –

38

Dieser Befehl Sie fast gibt, was Sie wollen, und es funktioniert auch mit einem Remote-Server. Der einzige Nachteil ist, dass es eine TSV-Datei generiert (Felder sind durch eine Registerkarte getrennt).

mysql mydb -e "select * from mytable" -B > mytable.tsv 

Aber man konnte es in CSV konvertieren sed verwenden, vorgeschlagen, wie in this answer

mysql mydb -e "select * from mytable" -B | sed "s/'/\'/;s/\t/\",\"/g;s/^/\"/;s/$/\"/;s/\n//g" > mytable.csv 
+0

Kann ich Where-Klausel verwenden? – Lnux

+0

@Lnux Ja, Sie können eine Where-Klausel verwenden, um die Suche einzugrenzen, alles im ersten zitierten Bereich mit der Auswahl, ist eine normale Datenbankabfrage. – Caperneoignis

+0

mysql -u root -p mydb -e "Wählen Sie * aus meiner Tabelle" -B | sed "s/'/ \' /; s/\ t/\", "/ g; s/^/\" /; s/$/\ "/; s/\ n // g"> mytable. csv - Das hat gut für mich funktioniert, danke –

1

ich das Skript für einfache UI-basierten Code integriert haben. Hier können Sie eine Abfrage eingeben und können einfach die CSV-Datei mit allen Zeilen einschließlich Spaltennamen erhalten.

Dieses Skript funktioniert sowohl für Windows- als auch für Linux-Systeme.

https://github.com/Bihari12/databasetocsv

Dies würde das Ergebnis in csv-Datei im selben Ordner, in dem Speichern der Code vorhanden ist.