Visual Basic: CSV Datei einlesen und durchsuchen?

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.


iqKleinerDrache  04.11.2019, 15:39

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.

iInjection 
Beitragsersteller
 04.11.2019, 15:23

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.

https://docs.microsoft.com/en-us/dotnet/api/microsoft.visualbasic.fileio.textfieldparser?redirectedfrom=MSDN&view=netframework-4.8

Du kannst das natürlich auch manuell zerlegen und so weiter, aber warum die Arbeit machen, die Microsoft schon getan hat?


iInjection 
Beitragsersteller
 04.11.2019, 15:06

Danke dir. Den TextFieldParser habe ich auch gefunden; wusste allerdings nicht, in wie fern ich es umsetzen kann, stecke in einem Logikloch oder so...

ohwehohach  04.11.2019, 15:08
@iInjection

Naja, Du liest die Datei mit dem TextFieldParser ein und rufst dann aus diesem den Wert der gewünschten "Zelle" ab. Ganz einfach :-)

iInjection 
Beitragsersteller
 04.11.2019, 15:22
@ohwehohach

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..

ohwehohach  04.11.2019, 15:32
@iInjection

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];