{"id":201,"date":"2013-04-17T19:35:28","date_gmt":"2013-04-17T19:35:28","guid":{"rendered":"http:\/\/blog.datentraeger.li\/?p=201"},"modified":"2017-03-02T02:10:59","modified_gmt":"2017-03-02T02:10:59","slug":"mysql-dump-in-csv","status":"publish","type":"post","link":"https:\/\/blog.datentraeger.li\/?p=201","title":{"rendered":"MySQL Dump in CSV"},"content":{"rendered":"<p>Und nochmals MySQL. Diesmal m\u00f6chte ich Daten zwecks Umstellung auf ein anderes System in eine CSV exportieren. Einfach einen Query in ein File pipen ist zwar m\u00f6glich, jedoch fehlen passt mir das ganze Bez\u00fcglich Formatierung nicht (Daten mit Tab getrennt). Ich m\u00f6chte jedoch die Werte in Quotes und durch Komma getrennt.<\/p>\n<pre class=\"lang:mysql decode:true\">SELECT * from Table\r\nINTO OUTFILE 'querydump.csv'\r\nFIELDS TERMINATED BY ','\r\nENCLOSED BY '\"'\r\nLINES TERMINATED BY '\\n'<\/pre>\n<p>Das File wird unter \/var\/lib\/mysql\/\/ abgelegt.<\/p>\n<p>Es geht nat\u00fcrlich auch direkt von der Konsole, hier kann zudem ein beliebiger Pfad gew\u00e4hlt werden<\/p>\n<pre class=\"wrap:true lang:mysql decode:true\">mysql -u  -p -e \"USE ; SELECT * from\r\nINTO OUTFILE '\/tmp\/querydump.csv' FIELDS TERMINATED BY '\\,' ENCLOSED BY '\\\"' LINES TERMINATED BY '\\n'\";<\/pre>\n<p>Im obigen Beispiel fehlen jedoch die Header (Tabellennamen), was aber oft oder meist ben\u00f6tigt wird.<\/p>\n<p>Hierzu findet man einige Varianten. Eine davon ist das Auslesen der Header in eine weitere Datei und dann beide Dateien zusammenzuf\u00fcgen. Sowas w\u00e4re in etwa die entsprechende Abfrage:<\/p>\n<pre class=\"wrap:true lang:mysql decode:true \">mysql -u  -p -e \"SELECT GROUP_CONCAT(COLUMN_NAME SEPARATOR ',') FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema='' and table_name='INTO OUTFILE '\/tmp\/querydump.csv' FIELDS TERMINATED BY '\\,' ENCLOSED BY '\\\"' LINES TERMINATED BY '\\n'\";<\/pre>\n<p>&#8216;&#8221;Mein Problem ist jedoch, dass ich gewisse Spalten beim Export zusammenf\u00fcge (zb. SELECT vorname, nachname AS fullname). Dann passen nat\u00fcrlich die Anzahl Zeilen hier nicht mehr. Irgenwie wirds mir hier zu bl\u00f6d, um ellenlange Commands zu tippen oder Skripte hierf\u00fcr zusammenzubasteln (<a href=\"http:\/\/spin.atomicobject.com\/2011\/05\/28\/3-ways-to-make-tab-delimited-files-from-your-mysql-table\/\" target=\"_blank\">Beispiele siehe u.a. hier<\/a>). Ich pipe deswegen die Bildschirm-Ausgabe (welche die Header ja beinhaltet) in ein File und bastle dann halt den Header selbst zurecht\u2026 (erste Zeile kopieren, in CSV einf\u00fcgen und Quotes, Kommas setzen)<\/p>\n<pre class=\"lang:mysql decode:true\">SELECT Vorname, Nachname AS fullname, &lt;weitere queries...&gt; FROM<\/pre>\n<p>&gt;<\/p>\n<p>Wieso nicht gleich so ? Weil hier die leeren Spalte nicht angezeigt werden, sprich also auch nicht exportiert werden\u2026.<\/p>\n<p>Dieses File kann dann zb mit sed zurechtgestutzt werden. Hier wird nur die erste Zeile mit head ausgegeben, alle W\u00f6rter mit sed in Anf\u00fchrungszeichen gesetzt (je nach dem muss das nat\u00fcrlich angepasst werden) und zu guter Letzt werden mit tr die Tabulatoren durch ein Komma ersetzt\u2026 geht wahrscheinlich auch mit einem einzelnen sed\u2026aber dann kanns wahrscheinlich kein Mensch mehr lesen \ud83d\ude09<\/p>\n<pre class=\"\" line=\"1\" lang=\"bash\">cat  |head -n 1|sed 's\/\\([A-Za-z_]\\+\\)\/\"\\1\"\/g'|tr -s \"\\t\" \"\\,\"<\/pre>\n<p>Das ganze kann nat\u00fcrlich bereits beim Export des Dumps gemacht werden<\/p>\n<pre class=\"lang:mysql decode:true \">SELECT Vorname, Nachname AS fullname, &lt;weitere queries...&gt; FROM<\/pre>\n<p>|head -n 1|sed &#8216;s\/\\([A-Za-z_]\\+\\)\/&#8221;\\1&#8243;\/g&#8217;|tr -s &#8220;\\t&#8221; &#8220;\\,&#8221; &gt;<\/p>\n<p>Nun schauts ganz gut aus, jedoch ist der Header am Schluss des Files\u2026nochmals umbauen..<\/p>\n<pre line=\"1\" lang=\"bash\">sed -i '1h;1d;$!H;$!d;G'<\/pre>\n<p>Mein Fazit zum Ganzen: es w\u00e4re angenehm, wenn man direkt definieren k\u00f6nnte, ob die Header mitexportiert werden sollen, w\u00fcrde das ganze wesentlich bequemer machen\u2026<\/p>\n","protected":false},"excerpt":{"rendered":"Und nochmals MySQL. Diesmal m\u00f6chte ich Daten zwecks Umstellung auf ein anderes System in eine CSV exportieren. Einfach einen Query in ein File pipen ist zwar m\u00f6glich, jedoch fehlen passt mir das ganze Bez\u00fcglich Formatierung nicht (Daten mit Tab getrennt). Ich m\u00f6chte jedoch die Werte in Quotes und durch Komma&hellip;\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[15,16],"tags":[],"class_list":["post-201","post","type-post","status-publish","format-standard","hentry","category-database","category-sql"],"_links":{"self":[{"href":"https:\/\/blog.datentraeger.li\/index.php?rest_route=\/wp\/v2\/posts\/201","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.datentraeger.li\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.datentraeger.li\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.datentraeger.li\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.datentraeger.li\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=201"}],"version-history":[{"count":7,"href":"https:\/\/blog.datentraeger.li\/index.php?rest_route=\/wp\/v2\/posts\/201\/revisions"}],"predecessor-version":[{"id":569,"href":"https:\/\/blog.datentraeger.li\/index.php?rest_route=\/wp\/v2\/posts\/201\/revisions\/569"}],"wp:attachment":[{"href":"https:\/\/blog.datentraeger.li\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=201"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.datentraeger.li\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=201"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.datentraeger.li\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=201"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}