CSV in Klasse konvertieren
-
Hallo zusammen,
ich versuche eine CSV Datei in eine Klasse zu parsen - aber es gelingt mir einfach nicht.
So ist die CSV aufgebaut:
:IngredientName;IngredientType;Unit;Unit;Unit;Unit;Unit;Unit;Unit;Unit;Unit;Unit;Unit;Unit;Unit;Unit;Unit;Unit;Unit;Unit;Unit;Unit;Unit;Unit;Unit;Unit;Unit;Unit;Recipe;Recipe;Recipe;Recipe;Recipe;Recipe;Recipe;Recipe;Recipe;Recipe;Recipe;Recipe;Recipe;Recipe;Recipe;Recipe;Recipe;Recipe;Recipe;Recipe;Recipe;Recipe;Recipe :Names;;WS;GSS;RBS;FSC;TW;SVK;SP1;KNEL;QT1;SEK;GSF1;GSF2;RBF;SP2;FK;AHD;GSD;DE;EK;TS;AS;PA;QT2;FW;SEK1;GSF3;12,5g Milch-Praline';12,5g Florentiner;12,5g Mocca-Sahne;12,5g Herbe Sahne;12,5g Nougat;12,5g Mandel-Milch-Nuss;12,5g Rahm-Trueffel;12,5g Edel-Sahne;18,2g Schoko-Milch;18,2g Milk & Crisp;Likoer-Praline;18,2g Pfefferminz-Praline;18,2g Florentiner-Praline;18,2g Orangen-Joghurt Praline;18,2g Erdbeer-Joghurt;18,2g Nuss & Crisp;Mousse Noisette;Mousse Milch;Mousse Feinherb;Milch Haselnuss J.D.Gross;Mousse Vanille 18,2;"Pfirsich Aprikose Joghurt 18.2g";"Joghurt rein 18.2g" "Text";Analog;"WS_Gruppe_Statuswort";;;;;;;;;;;;;;;;;;;;;;;;;;33819136;33819136;33622528;33819136;33819136;33819136;33622528;33819136;33819136;33819136;33819136;33622528;33819136;33818112;33819136;33819136;33819136;33819136;33819136;33622528;33622528;33819136;33819136 "Text";Analog;"WS_M1_Sollwert_Auto";;;;;;;;;;;;;;;;;;;;;;;;;;60;60;60;60;60;60;60;60;60;60;60;60;60;60;60;60;60;60;60;60;60;60;60 "Text";Analog;"WS_M1_SW_Auto_Max";;;;;;;;;;;;;;;;;;;;;;;;;;100;100;100;100;100;100;100;100;100;100;100;100;100;100;100;100;100;100;100;100;100;100;100 "Text";Analog;"WS_M1_SW_Auto_Min";;;;;;;;;;;;;;;;;;;;;;;;;;20;20;20;20;20;20;20;20;20;20;20;20;20;20;20;20;20;20;20;20;20;20;20 "Text";Analog;"WS_M1_Statuswort";;;;;;;;;;;;;;;;;;;;;;;;;;17546;17546;-31606;17546;17546;17546;-31606;17546;17546;17546;17546;-31606;17546;17546;17546;17546;17546;-31606;17546;17546;-31606;17546;17546 "Text";Analog;"WS_M2_Sollwert_Auto";;;;;;;;;;;;;;;;;;;;;;;;;;60;60;60;60;60;60;60;60;60;60;60;60;60;60;60;60;60;60;60;60;60;60;60 "Text";Analog;"WS_M2_SW_Auto_Max";;;;;;;;;;;;;;;;;;;;;;;;;;100;100;100;100;100;100;100;100;100;100;100;100;100;100;100;100;100;100;100;100;100;100;100 "Text";Analog;"WS_M2_SW_Auto_Min";;;;;;;;;;;;;;;;;;;;;;;;;;20;20;20;20;20;20;20;20;20;20;20;20;20;20;20;20;20;20;20;20;20;20;20 "Text";Analog;"WS_M2_Statuswort";;;;;;;;;;;;;;;;;;;;;;;;;;17546;17546;-31606;17546;17546;17546;-31606;17546;17546;17546;17546;-31606;17546;17546;17546;17546;17546;-31606;17546;17546;-31606;17546;17546 "Text";Analog;"WS_M3_Statuswort";;;;;;;;;;;;;;;;;;;;;;;;;;17610;17610;17610;17610;17610;17610;17610;17610;17610;9418;9418;17610;17610;9418;17610;9418;17610;17610;17610;17610;17610;17610;17610 "Text";Analog;"WS_M4_Statuswort";;;;;;;;;;;;;;;;;;;;;;;;;;9418;9418;17610;9418;9418;9418;17610;9418;9418;9418;9418;17610;9418;9418;9418;9418;9418;17610;9418;9418;17610;9418;9418 "Text";Analog;"WS_M5_Statuswort";;;;;;;;;;;;;;;;;;;;;;;;;;17610;17610;17610;17610;17610;17610;17610;17610;17610;9418;9418;17610;17610;9418;17610;9418;17610;17610;17610;17610;17610;17610;17610 "Text";Analog;"WS_M6_Statuswort";;;;;;;;;;;;;;;;;;;;;;;;;;9418;9418;17610;9418;9418;9418;17610;9418;9418;9418;9418;17610;9418;9418;9418;9418;9418;17610;9418;9418;17610;9418;9418 "Text";Analog;"WS_Y600_Sollwert_Auto";;;;;;;;;;;;;;;;;;;;;;;;;;26;26;2.604.999.924;26;26;26;26;26;29;26;26;29;26;29;29;29;29;29;29;29;29;29;29 "Text";Analog;"WS_Y600_Sollwert_max_Auto" "Text";Analog;"WS_Y600_Sollwert_min_Auto" "Text";Analog;"WS_Y600_Statuswort";;;;;;;;;;;;;;;;;;;;;;;;;;-31606;-31606;-31606;-31606;-31606;-31606;-31606;-31606;-31606;-31606;-31606;-31606;-31606;-31606;-31606;-31606;-31606;-31606;-31606;-31606;-31606;-31606;-31606 "Text";Analog;"WS_Y602_Sollwert_Auto";;;;;;;;;;;;;;;;;;;;;;;;;;33;34.5;29;29;33;33;34.5;29;34;29.05.2012;31.05.2012;34;34.5;34;34;34;34;34.5;34.5;34;31.5;34;34 "Text";Analog;"WS_Y602_SW_Auto_Max";;;;;;;;;;;;;;;;;;;;;;;;;;100;100;100;100;100;100;100;100;100;100;100;100;100;100;100;100;100;100;100;100;100;100;100 "Text";Analog;"WS_Y602_SW_Auto_Min";;;;;;;;;;;;;;;;;;;;;;;;;;20;20;20;20;20;20;20;20;20;20;20;20;20;20;20;20;20;20;20;20;20;20;20 "Text";Analog;"WS_Y602_Statuswort";;;;;;;;;;;;;;;;;;;;;;;;;;17546;17546;-31606;17546;17546;17546;-31606;17546;17546;17546;17546;-31606;17546;17546;17546;17546;17546;-31606;17546;17546;-31606;17546;17546 "Text";Analog;"WS_Y616_Sollwert_Auto";;;;;;;;;;;;;;;;;;;;;;;;;;100;23;100;2.404.999.924;23;26;100;100;30;20;28.05.2012;32.5;24. Mai;24.05.2012;24;25;32.5;32.5;32.5;30;32.5;24;24 "Text";Analog;"WS_Y616_SW_Auto_Max";;;;;;;;;;;;;;;;;;;;;;;;;;50;50;50;50;50;50;50;50;50;50;50;50;50;50;50;50;50;50;50;50;50;50;50 "Text";Analog;"WS_Y616_SW_Auto_Min";;;;;;;;;;;;;;;;;;;;;;;;;;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0 "Text";Analog;"WS_Y616_Statuswort";;;;;;;;;;;;;;;;;;;;;;;;;;-31606;-31606;-31606;-31606;-31606;-31606;-31606;-31606;-31606;-31606;-31606;-31606;-31606;17546;-31606;-31606;-31606;-31606;-31606;-31606;-31606;-31606;-31606 "Text";Analog;"WS_Y618_Sollwert_Auto";;;;;;;;;;;;;;;;;;;;;;;;;;30;32;29;29;30;30;32;29;30;29.05.2012;31.05.2012;31.04999924;32;24.05.2012;30;30;32;32.5;32;32;31.5;30;30 "Text";Analog;"WS_Y618_SW_Auto_Max";;;;;;;;;;;;;;;;;;;;;;;;;;100;100;100;100;100;100;100;100;100;100;100;100;100;100;100;100;100;100;100;100;100;100;100 "Text";Analog;"WS_Y618_SW_Auto_Min";;;;;;;;;;;;;;;;;;;;;;;;;;20;20;20;20;20;20;20;20;20;20;20;20;20;20;20;20;20;20;20;20;20;20;20 "Text";Analog;"WS_Y618_Statuswort";;;;;;;;;;;;;;;;;;;;;;;;;;17546;17546;-31606;17546;17546;17546;-31606;17546;17546;17546;17546;-31606;17546;-31606;17546;17546;17546;-31606;17546;17546;-31606;17546;17546 "Text";Analog "Text";Discrete;;"GSS_Gruppe_Statuswort.15";;;;;;;;;;;;;;;;;;;;;;;;;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1 "Text";Discrete;;"GSS_Gruppe_Statuswort.16";;;;;;;;;;;;;;;;;;;;;;;;;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0 "Text";Discrete;;"GSS_Gruppe_Statuswort.17";;;;;;;;;;;;;;;;;;;;;;;;;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1 "Text";Analog;;"GSS_K123_1_Max_Kessel";;;;;;;;;;;;;;;;;;;;;;;;;35;35;32;35;35;35;36;35;35;35;30;35;35;35;35;35;35;35;35;35;35;35;35 "Text";Analog;;"GSS_K123_1_Min_Kessel";;;;;;;;;;;;;;;;;;;;;;;;;25;30;25;30;30;25;30;25;30;25;25;30;25;27;27;30;30;30;30;30;30;30;30 "Text";Analog;;"GSS_M2_Statuswort";;;;;;;;;;;;;;;;;;;;;;;;;10442;10442;20682;10442;10442;10442;10442;10442;10442;10442;10442;10442;10442;10442;10442;2250;10442;10442;10442;10442;10442;10442;10442 "Text";Analog;;"GSS_SW_Ansauggeschw";;;;;;;;;;;;;;;;;;;;;;;;;30;30;25;25;30;30;30;25;7;30;60;28;30;28;28;28;28;28;28;28;28;28;28 "Text";Analog;;"GSS_SW_Ansaughub";;;;;;;;;;;;;;;;;;;;;;;;;7.400.000.095;7.400.000.095;9.699.999.809;19.75;7.400.000.095;7.400.000.095;7.400.000.095;19.75;1.039.999.962;1369999981;20;10.30000019;10;1380000019;1.019.999.981;14;14;14;10.30000019;9.949.999.809;10.19999981;10.30000019;10.30000019 "Text";Analog;;"GSS_SW_Giessgeschw";;;;;;;;;;;;;;;;;;;;;;;;;30;30;55;55;30;30;30;55;60;50;70;38;30;31;40;38;31;31;35;36;35;40;40 "Text";Analog;;"GSS_SW_Ruecksauggeschw";;;;;;;;;;;;;;;;;;;;;;;;;50;50;150;150;50;50;50;150;50;100;100;50;50;50;50;50;50;50;50;50;50;50;50 "Text";Analog;;"GSS_SW_Ruecksaughub";;;;;;;;;;;;;;;;;;;;;;;;;1;1;0.5;0.5;1;1;1;0.5;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1 "Text";Analog;;"GSS_SW_Verdichtungsgeschw";;;;;;;;;;;;;;;;;;;;;;;;;20;20;20;20;20;20;20;20;20;20;20;20;20;20;20;20;20;20;20;20;20;20;20 "Text";Analog;;"GSS_SW_Verdichtungshub";;;;;;;;;;;;;;;;;;;;;;;;;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0 "Text";Analog;;"GSS_SW_Verweilz_nach_Guss";;;;;;;;;;;;;;;;;;;;;;;;;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0 "Text";Analog;;"GSS_SW_Verz_Heben";;;;;;;;;;;;;;;;;;;;;;;;;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2 "Text";Analog;;"GSS_SW_Verz_Senken";;;;;;;;;;;;;;;;;;;;;;;;;2;2;250;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2 "Text";Analog;;"GSS_SW_Verz_Start_Giessen";;;;;;;;;;;;;;;;;;;;;;;;;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0 "Text";Analog;;"GSS_SW_Zeit_zum_Oeffnen";;;;;;;;;;;;;;;;;;;;;;;;;200;200;200;200;200;200;200;200;200;200;200;200;200;200;200;200;200;200;200;200;200;200;200 "Text";Analog;;"GSS_SW_Zeit_zum_Schliessen";;;;;;;;;;;;;;;;;;;;;;;;;200;200;200;200;200;200;200;200;200;200;200;200;200;200;200;200;200;200;200;200;200;200;200 "Text";Analog;;"GSS_Temperierung_SW_max";;;;;;;;;;;;;;;;;;;;;;;;;60;60;60;60;60;60;60;60;60;60;60;60;60;60;60;60;60;60;60;60;60;60;60 "Text";Analog;;"GSS_Temperierung_SW_min";;;;;;;;;;;;;;;;;;;;;;;;;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0 "Text";Analog;;"GSS_Temperierung_SW_Temperieren";;;;;;;;;;;;;;;;;;;;;;;;;32;32;33;32;32;32;33;32;33;3240000153;33;32.5;33;34;32;32;33;3179999924;33;32;33;32;32 "Text";Analog;;"GSS_Temperierung_SW_Aufheizen";;;;;;;;;;;;;;;;;;;;;;;;;40;40;40;40;40;40;40;40;40;45;45;40;45;43;40;40;40;40;40;40;40;40;40 "Text";Analog;;"GSS_Y216_0_Statuswort";;;;;;;;;;;;;;;;;;;;;;;;;1226;1226;1226;1226;17610;1226;17610;1226;17610;17610;17610;17610;1226;17610;17610;17610;17610;17610;1226;17610;17610;1226;17610 "Text";Analog;;"GSS_Y216_2_Statuswort";;;;;;;;;;;;;;;;;;;;;;;;;17610;17610;17610;17610;17610;17610;17610;17610;17610;17610;17610;17610;17610;17610;17610;17610;17610;17610;17610;17610;17610;17610;17610 "Text";Analog "Text";Analog;;;"RBS_Gruppe_Statuswort";;;;;;;;;;;;;;;;;;;;;;;;33685504;33685504;33685504;33685504;33685504;33685504;33685504;33685504;33685504;33685504;33685504;33685504;33685504;33685504;33685504;33685504;33685504;33685504;33685504;33685504;33685504;33685504;33685504 "Text";Analog;;;"RBS_M1_M2_Nachlaufzeit";;;;;;;;;;;;;;;;;;;;;;;;30;0;30;30;0;0;30;30;30;30;0;30;30;30;30;30;30;30;30;30;30;30;30 "Text";Analog;;;"RBS_M1_M2_Sollwert_Auto";;;;;;;;;;;;;;;;;;;;;;;;40;40;38;38;40;40;40;38;38;40;45;38;40;40;40;40;40;40;38;38;38;40;40 "Text";Analog;;;"RBS_M1_M2_SW_Auto_Max";;;;;;;;;;;;;;;;;;;;;;;;100;100;70;100;100;100;100;100;100;100;100;100;100;100;100;100;100;100;100;100;100;100;100 "Text";Analog;;;"RBS_M1_M2_SW_Auto_Min";;;;;;;;;;;;;;;;;;;;;;;;40;40;30;2;40;40;40;30;2;40;40;2;40;40;40;40;40;40;20;20;20;40;40
Das Problem das ich habe liegt beim UNIT wechsel. Hierbei verschieben sich die erforderlichen Daten um eine Spalte. Habt ihr eine Idee wie ich das ganze logisch angehen könnte ?
Unit;Unit;Recipe;Recipe;Recipe;Recipe;Recipe
-
Welchen CSV-Parser benutzt du denn?
Empfehlen kann ich
A fast CSV reader
Simple and fast CSV library in C#Und stimmen denn die Anzahl der Semikolons?
-
Tja, genau das ist mein Problem. Es sind exakt 51 Einträge in der X-Achse. Allerdings kann die Y-Achse auch mal nur 3 Einträge enthalten.
Die eigentliche Schwierigkeit besteht für mich darin, das sich beim wechsel einer UNIT die Position der Daten ändert.
Noch dazu muss ich gestehen, das ich keinen separaten Parser nutze - und sowas bisher immer händisch auseinandergefrickelt habe.
Nur die Sache mit den UNITS kostet mich jetzt schon Tage ...
-
Erstmal das ganze Gedöns in ein List<List<string>> einlesen und diese Listen dann parsen. In Abhängigkeit der Units erstellst Du eben Objekte des richtigen Typs in einer kleinen Factory-Methode.
Hingefrickelt:
static List<List<string>> LoadCSV(string filepath, char separator) { if (!File.Exists(filepath)) throw new ArgumentException(string.Format("File {0} does not exist", filepath)); var lines = File.ReadAllLines(filepath).ToList(); var res = new List<List<string>>(lines.Count); lines.ForEach(line => { var split = line.Split(new char[] { separator }, StringSplitOptions.RemoveEmptyEntries); if (split != null && split.Length > 0) res.Add(new List<string>(split)); }); return res; }
Anmerkung: RemoveEmptyEntries ist evtl nicht was du willst. Denn bei festen Positionen ist es sinnvoller die Leereinträge nicht auszusortieren.
List<List<string>> csv = LoadCSV(@"C:\test.csv", ';'); foreach(var line in csv) { string itemType = line[2]; if(itemType == "WS_Gruppe_Statuswort") { } else if (itemType == "WS_M1_Sollwert_Aut") { } //... }