2016-05-11 14 views
0

ich eine MySQL-Tabelle als CSV heruntergeladen haben, die über tausend Einträge des folgenden Typs hat:MySQL zu CSV - Trennen Sie mehrere Werte

id,gender,garment-color 
1,male,white 
2,"male,female",black 
3,female,"red,pink" 

Nun, wenn ich ein Diagramm aus diesen Daten zu erstellen versuche Es nimmt "männlich" als einen Wert und "männlich, weiblich" als einen separaten Wert.

Also, für das obige Beispiel, anstatt 2 "männlich" und 3 "weiblich" zu zählen, zeigt das Diagramm 3 separate Kategorien ("männlich", "weiblich", "männlich, weiblich"), mit einem Zählen Sie jedes.

Ich möchte die Ausgabe wie folgt für die Grafik die richtige Anzahl zu haben:

id,gender,garment-color 
1,male,white 
2,male,black 
2,female,black  
3,female,red 
3,female,pink 

Der einzige Weg, ich weiß, ist die Zeile in MS Excel zu kopieren und die Werte manuell einstellen, die für zu langweilig ist 1000+ Einträge. Gibt es einen besseren Weg?

Antwort

0

Von MySQL Kommandozeile oder was auch immer Werkzeug, das Sie verwenden Abfragen an MySQL zu senden:

select * from the_table 
into outfile '/tmp/out.txt' fields terminated by ',' enclosed by '"' 

Dann /tmp/out.txt' from the server and it should be good to go assuming your data is good. If it is not, you might need to massage it with some SQL function use in the select` herunterladen.

0

Der CSV stammt wahrscheinlich aus einer schlecht entworfenen/normalisierten Datenbank, die beide Werte in derselben Zeile hatte. Sie könnten versuchen, Selects und updates mit einigen eingebauten String-Funktionen in solchen Zeilen zu verwenden, um zusätzliche Zeilen zu erzeugen, die die zusätzlichen Werte enthalten, und ihre ursprünglichen Zeilen zu aktualisieren, um diese Werte zu entfernen. aber Sie müssen wiederholen, bis alle Kommas entfernt sind (wenn es mehr als eins in einem Feld gibt), und müssen bestimmen, ob eine Zeile, die mehrere Felder mit solchen durch Kommas getrennten Listen enthält, multipliziert werden muss (dh 2 Geschlecht und 4 Farbe bedeutet 8 Zeilen insgesamt).

Wahrscheinlich werden Sie wahrscheinlich zusätzliche Tabellen für X_garmentcolors und X_Genders erstellen möchten; wo X ist, was auch immer die ursprüngliche Tabelle beschreiben soll. Diese Tabellen würden ein X_id-Feld haben, das auf die ursprüngliche Zeile verweist, und ein [chain color | gender] -Wertfeld, das einen der Werte in den ursprünglichen Zeilenlisten enthält. Idealerweise sollten sie tatsächlich Referenztabellen [gender | garmentcolor] referenzieren, anstatt tatsächliche Werte zu halten. aber Sie müssten die grunzende Arbeit machen, indem Sie zuerst all die einzigartigen Farben und Geschlechter aus Ihren Daten heraussuchen. Sobald das erledigt ist, können Sie etwas tun wie:

INSERT INTO X_[garmentcolor|gender] (X_id, Y_id) 
SELECT X.X_id, Y.Y_id 
FROM originalTable AS X 
INNER JOIN valueTable AS Y 
ON X.Y_valuelist LIKE CONCAT('%,' Y.value)   -- Value at end of list 
OR X.Y_valuelist LIKE CONCAT('%,' Y.value, ',%') -- Value in middle of list 
OR X.Y_valuelist LIKE CONCAT(Y.value, ',%')   -- Value at start of list 
OR X.Y_valuelist = Y.value       -- Value is entire list 
;