Visual Basic: CSV Datei einlesen und durchsuchen?
Moin liebe Community,
Ich möchte mir ein kleines Programm schreiben (In VB, weil es für mich relativ einfach war einzusteigen). Mir liegt eine CSV Datei vor (Mit ; getrennt), in diesem Format:
Staffel;VarianteA;VarianteB
1;27,10;15,50
2;31,40;19,95
3;35,50;24,60
Nun Stelle ich mir die Frage, wie ich es schaffe, folgendes Problem zu lösen:
Variable (decimal) ist z. B. 2
Variable (string) ist z.B: VarianteB
Lösung: suche aus der CSV unter Staffel die 2. und gebe den wert für VarianteB (also 19,95) aus.
Nur weiß ich nicht, wie ich dahin komme.
Ist übrgends ein kleines Abfrageprogramm für ein Spiel von mir und ein paar Kollegen entwickelt, was einen Markt hat, wo Preise sich über die API auslesen und als CSV exportieren lassen. (Ist alles noch in der Entwicklung)
2 Antworten
Den kompletten Inhalt in eine String-Variable einlesen (geht nur wenn es sich um eine Datei mit max. 1 GB Größe handelt, sonst wirds zu langsam).
Dann mit dem Befehl Split in ein Variant-Array einlesen, mit Trennzeichen <CRLF> (chr(13) + chr(10)).
Jede einzelne Zeile nochmal in ein Variant-Array einlesen, mit Trennzeichen ; (Strichpunkt, nicht Komma).
Das ganze geschachtelt. Dann hast du die ganze CSV in ein 2-dimensionales Array übertragen.
Da kannst du dann beliebige deiner Abfragen durchführen.
Also wir nehmen jetzt mal VBA (Visual Basic for Applications):
Private Function FileText(filename$) As String
Dim handle As Integer
handle = FreeFile
Open filename$ For Input As #handle
FileText = Input$(LOF(handle), handle)
Close #handle
End Function
a = FileText("einlesefile.csv")
b = Split(a, chr(13)+chr(10))
for i = Lbound(b) to Ubound(b)
c = Split(b(i),";")
next
statt des c nochmal ein Array definieren zur späteren verwendung ansonsten musst du direkt in der einleseschleife suchen.
Deine "Anleitung" wirkt etwas kompliziert; Wie kann ich mir das vorstellen?
VB oder VB.NET? Für VB.NET (oder jede andere Sprache des .NET Framework) gibt es die schöne Klasse TextFieldParser aus dem Namespace Microsoft.VisualBasic.FileIo. Die kann CSV Dateien einlesen und per Feldname oder Feldindex den Wert liefern.
Du kannst das natürlich auch manuell zerlegen und so weiter, aber warum die Arbeit machen, die Microsoft schon getan hat?
Naja, Du liest die Datei mit dem TextFieldParser ein und rufst dann aus diesem den Wert der gewünschten "Zelle" ab. Ganz einfach :-)
Okay aber wie finde ich des denn raus; ich brauche z.b. Stafffel 2, Variante a.
Ich weiß, also, dass ich in Zeile "Staffel" bei "2" den wert unter "VarianteA" haben muss, aber wie bekomme ich das hin? ich Stehe aufm Schlauch..
Nun, du musst eben Zeilenweise durchgehen und in der ersten Spalte schauen, ob da eine 2 drinsteht. Dann hast Du die richtige Zeile. Dann ist die Frage (und das weiß ich gerade nicht aus dem Kopf), ob man die Spalten auch per Spaltenbezeichnung ansprechen kann oder immer per Index. Falls Letzteres, musst Du halt sowas schreiben wie (in C#):
int spaltenNummer = 1;
if (gewünschteSpalte == "VarianteB") spaltenNummer = 2;
if (gewünschteSpalte == "VarianteC") spaltenNummer = 3;
...
Oder Du ermittelst die Spalte aus den Daten der ersten Zeile. Gehst quasi die erste Zeile Spalte für Spalte durch und schaust, bei welchem Spaltenindex der gewünschte Spaltenname drinsteht. Dann hast Du den Spalteindex und musst nur noch die Zeile finden wie oben beschrieben.
Insgesamt also (Pseudocode):
gewünschteStaffel = 2
gewünschterName = "VarianteA"
gewünschterSpaltenIndex = -1
for (i = 0; i < Spaltenanzahl; i++)
if (spalte[i] == gewünschterName) gewünschterSpaltenIndex = i
foreach (zeile in CSV)
if (spalte[0] == gewünschteStaffel)
return spalte[gewünschterSpaltenIndex];
Danke dir. Den TextFieldParser habe ich auch gefunden; wusste allerdings nicht, in wie fern ich es umsetzen kann, stecke in einem Logikloch oder so...