Erste Spalte einer CSV durchsuchen und Inhalt der Zeile wiedergeben

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von Mitschy.

    Erste Spalte einer CSV durchsuchen und Inhalt der Zeile wiedergeben

    Hallo Gemeinde,

    ich habe mir jetzt bereits viele CSV Themen angesehen aber nichts passendes gefunden.

    Das Thema habe ich bereits hier:

    [VB 2010] Exceltabelle mit VB durchsuchen und Wert wiedergeben

    erledigt gehabt bis ich festgestellt habe das es mir Excel Starter 2010 nicht geht.

    So sieht meine CSV stark reduziert aus (als Bsp.):

    123;text1;text1a
    234;text2;text2a
    456;text3;text3a
    578;text4;text4a

    Nun soll mein Programm (am besten OHNE vorher die ganz CSV einzulesen) in der ersten Spalte nach zum Beispiel 456 suchen und mir dann wahlweise text3, text3a oder beides ausgeben.

    Ist das Möglich? Wenn ja, wie?

    Der Grund warum ich nicht will das er vorher die ganze CSV einliest ist, dass ich so wenig wie möglich Rechenzeit aufwenden möchte. Insgesamt habe ich über 2000 Spalten und ich merkte schon mit Excel, das dass recht lange braucht.

    Danke für eure Tipps.

    Viele Grüße



    EDIT:

    Da ich ein Anfänger auf dem Gebiet bin währe für mich erstmal wichtig wie ich überhaupt auf die CSV zugreife. Also wie kann ich überhaupt eine bestimmte Zelle der CSV auslesen und in einer Textbox wiedergeben?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Mitschy“ ()

    Nicht die ganze Datei wird möglich sein, sofern die zu suchende Zeile nicht ganz am Ende steht. Ansonsten eben Zeilenweise die Datei durchgehen und prüfen ob eine Zeile mit xyz beginnt.

    Hierzu könnte man den StreamReader nutzen um sie Zeilenweise einzulesen mit Readline().
    Suchen auf Festplatte geht schlecht. :S
    Lies also die Date Zeile für Zeile ein (StreamReader) oder en Bloc (ReadAllLines).
    Splitte die Zeile nach ";" und wenn Du Deine Zeile gefunden hast, tu, was Du zu tun hast.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ist das erste Feld eindeutig?
    Wenn du häufig nach Strings suchen muss, kannst du dir eine Collection (oder eine List) erzeugen, der du als Key das erste Feld mitgibst.
    Achtung: weitgehend PseudoCode

    VB.NET-Quellcode

    1. Dim Coll as New Collection
    2. Do Until File.EOF
    3. Line=ReadLine
    4. Fields=Line.Split(";"c)
    5. Coll.Add (Line, Fields(0))
    6. Loop


    Abfragen kannst du dann mit

    VB.NET-Quellcode

    1. MyLine = Coll(MyField)
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Guten Abend,

    danke für die Hilfe.

    petaod schrieb:

    Ist das erste Feld eindeutig?
    Also der Inhalt der CSV kann beliebig geändert werden (also alles bis auf den Tabellenkopf). Würde demnach sagen das erste Feld ist nicht eindeutig.


    Werde es jetzt gleich mal ausprobieren.

    Edit:
    @petaod

    Leider kann ich deinen Code nicht nachvollziehen oder testen. Ich denke mal für die Collection funktion muss ich wieder irgendetwas am Anfang als "Imports" setzen.

    Ich hätte noch eine andere Idee, aber es scheitert an der Umsetzung.

    Da die ersten 10 Zeichen in der Zeile immer Zahlen (meine gesuchte Artikelnummer) sind könnte man doch diese immer vergleichen.

    Programmiert habe ich jetzt das:

    VB.NET-Quellcode

    1. Dim reader As New System.IO.StreamReader(Pfad_zur_Datenbank)
    2. TextBox3.Text = reader.ReadLine
    3. reader.Close()


    Problem ist das ich nicht in die zweite Zeile komme um diese auszulesen. Dann könnte man es wieder mit eine einfachen Schleife machen.


    Edit by Dodo:
    Keine Doppelpostings zeitlich so nah beieinander, es gibt eine Funktion hier die nennt sich Editieren, bitte benutzte diese in Zukunft.
    -> Beiträge zusammengefügt.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Dodo“ ()

    Wenn die Schlüsselfelder nicht eindeutig sind, ist der Lookup aber eine Farce.
    Oder willst du immer nur das erste (oder das letzte?) Vorkommen des gefundenen Feldes für deinen Lookup verwenden?

    Und willst du bei jedem Lookup die Datei durchnudeln?

    Deswegen war ja meine Idee, das einmal einzulesen und über eine indizierte Struktur (z.B. Collection) den Lookup zu machen.

    Aber ich fürchte, wenn du schon Probleme hast, in Eigeninitiative um deine Read-Befehle eine Schleife zu programmieren, wirst du das mit der Collection auch nicht hinkriegen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „petaod“ ()

    So siehts aus!

    Ich würde ja gerne eine Schleife programmieren aber wenn ich:
    TextBox3.Text = reader.ReadLine(0) mache spuckt er mir A aus
    TextBox3.Text = reader.ReadLine(1) = r
    TextBox3.Text = reader.ReadLine(2) = t
    usw.

    am Ende steht das Artikelnummer! Sprich ich habe keine Plan wie der jetzt in die nächste Zeil springt????

    Ja mit dem Collection-Zeug hört sich ja gut an aber wie soll ich das machen! Nochmal ich sitze seit ein paar Tagen vor dem Programm und lese tausende Foren durch, aber wenn ich keine Antwort auf mein Problem finde ist es für mich einfacher zu fragen.
    Das ist so wie wenn ich in ein neues Geschäft gehe und den Senf suche! Entwerde ich lese von vorn bis zum Senf alles durch oder ich frage eine nette Verkäuferin wo ich den finde! Was geht schneller?

    Edit: Ist ja nicht so das ich das nicht verstehen will, dann kann ich auch C&P machen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Mitschy“ ()

    VB.NET-Quellcode

    1. TextBox3.Text = "bla"

    Du überschreibst permanent TextBox3.
    Ich denke, Du solltest Dir erst mal einen Grobplan machen und aus diesem einzelne Aufgaben ableiten und einzeln und unabhängig voneinander in je einem kleinen Testprojekt lösen.
    Wenn das alles zu Deiner Zufriedenheit läuft, erstellst Du Dir ein neues Programm, in dem Du das alles zusammenfasst.
    Da wären:
    - Dateien zeilenweise einlesen
    - Textzeilen zerpflücken
    - Daten als solche halten und ggf. speichern (Dateiformat, z.B. xml)
    - Daten sinnvoll in einer GUI anzeigen
    usw.
    Wenn Du jetzt schon anfängst, alles zu vermengen, hast Du einen Klumpen Code, den Du nach einer Woche selbst nicht mehr verstehst.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    So versuche ich es die ganze Zeit ein Codefetzen testen und schauen ob ich es verwenden kann.

    Habe das Thema ja schon hier behandelt:
    [VB 2010] Exceltabelle mit VB durchsuchen und Wert wiedergeben

    Aber leider habe ich nur Office Starter 2010 auf dem Rechner auf Arbeit. Also muss ich das jetzt mit der csv Datei machen.

    Edit:

    Eine GUI hab ich schon fertig. Und ich gebe das was ich dann auslese in der Textbox3 bei mir im Programm aus.

    Sprich ich gebe eine Artikelnummer (textbox2) ein bekomme auch nur eine Spalte mit dem Dateipfad als Antwort (in textbox3). Deswegen hab ich alles in Textbox3 geschrieben.

    Meine Frage ist wie komme ich mit dem reader.ReadLine() Befehl in die Zeile 1,2,3 ... x?

    Weil wenn ich z.B. schreibe reader.ReadLine(2) gibt er mir in der Zeile 0 den 2ten Eintrag aus und das ist das t. In der Zeile 0 steht als erstes Wort Artikelnummer.

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Mitschy“ ()

    Du Irrtum vom Amt. :S
    reader.ReadLine holt nicht die Zeile n, wenn Du einen Parameter übergibst, der dem Befehl nicht gefällt,
    reader.ReadLine liest die nächste Zeile aus der Datei aus.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Habe gerade das hier gefunden im Netz:

    ehow.com/how_6972589_do-line-using-visual-basic_.html

    Das werd ich mal testen.

    VB.NET-Quellcode

    1. While fileReader.Peek <> -1
    2. lineRead = fileReader.ReadLine()
    3. MsgBox(lineRead)
    4. End While


    Wobei ich aber diesen Befehl "fileReader.Peek <> -1" nicht verstehe.

    EIDT:

    Und gestern habe ich bereits die Funktion Substring(0,10) getestet so das ich nur die ersten 10 Zeichen eine Zeile einlese. Wobei er mir da immer den Fehler Überlauf ausgegeben hat. Da habe ich den Fehler noch nicht gefunden.
    Sieh Dir mal das hier an:

    VB.NET-Quellcode

    1. Using reader As New System.IO.StreamReader(Pfad_zur_Datenbank)
    2. Do While reader.EndOfStream
    3. Dim line As String = reader.ReadLine
    4. MessageBox.Show(line)
    5. Loop
    6. End Using
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    So liebe Leute hab es hinbekommen!

    Hat lange gedauert und hab ganzschön gefummelt

    Hier die Lösung für mein Problem

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    2. 'Deklaration für Zeilen auslesen
    3. Dim Datei As System.IO.StreamReader = File.OpenText(Pfad_zur_Datenbank)
    4. Dim Zeile As String
    5. Dim i As Int16 = 0
    6. Dim Zelle3_Inhalt = ""
    7. 'Schleife die Zeilen durchläuft
    8. While Datei.Peek <> -1
    9. 'Inhalt der ganzen Zeile auslesen
    10. Zeile = Datei.ReadLine()
    11. 'Deklaration zum Spliten
    12. Dim split As String() = Zeile.Split(New [Char]() {";"c})
    13. Dim Zelle1_Inhalt = ""
    14. 'Schleife zum spliten des Zeileninhalts
    15. For Each Zelle1_Inhalt In split
    16. 'Leerzeichen am Anfang und Ende entfernen
    17. If Zelle1_Inhalt.Trim() <> "" Then
    18. End If
    19. Exit For REM: mit "Exit For" wird nur die erste Spalte ausgelesen
    20. Next
    21. 'Vergleichen des Zeileninhalts mit der Artikelnummer in der CSV
    22. If ArtikelNr = Zelle1_Inhalt Then
    23. 'Schleife zum spliten des Zeileninhalts
    24. For Each Zelle3_Inhalt In split
    25. 'Leerzeichen am Anfang und Ende entfernen
    26. If Zelle3_Inhalt.Trim() <> "" Then
    27. End If
    28. 'Spalten Nummer 3 auslesen
    29. If i = 2 Then
    30. 'Inhalt der Zelle an Pfad_zum_Job übergeben
    31. Pfad_zum_Job = Pfad_zu_Jobs_Hauptordner & Zelle3_Inhalt
    32. Exit While REM: While-Schleife verlasssen
    33. Else
    34. i = i + 1 REM: Spaltenummer hochzählen
    35. End If
    36. Next
    37. End If
    38. End While
    39. ' Wenn Artikelnummer nicht gefunden wurde wird eine Fehler ausgegeben
    40. If i = 0 Then
    41. MsgBox("Artikelnummer " & ArtikelNr & " wurde nicht gefunden!", vbInformation)
    42. Exit Sub
    43. End If
    44. 'Dateipfad in Textbox3 ausgeben und in Zwischenablage kopieren
    45. 'Zwischenablage löchen
    46. Clipboard.Clear()
    47. 'Prüfen ob ein Inhalt in Zelle3_Inhalt steht
    48. If Zelle3_Inhalt = "" Then
    49. 'Inhalt der Textbox3 löschen
    50. TextBox3.Clear()
    51. 'Inhalt in Zwischenablage löschen
    52. Clipboard.Clear()
    53. 'Fehlermeldung ausgeben
    54. MsgBox("Artikelnummer gefunden, aber kein Dateipfad vorhanden! Bitte neue Artikelnummer eingeben.", vbInformation)
    55. Exit Sub
    56. Else
    57. 'Listbox Artikelnummer übergeben
    58. ListBox1.Items.Insert(0, ArtikelNr)
    59. 'gesamten Dateipfad an Textbox3 übergeben
    60. TextBox3.Text = Pfad_zum_Job
    61. 'Inhalt von Textbox3 in Zwischenablage kopieren
    62. Clipboard.SetText(TextBox3.Text)
    63. End If
    64. Exit Sub
    65. Fehlermarke1:
    66. MsgBox("Artikelnummer eingeben!", vbExclamation)
    67. End Sub


    Ist zwar vermutlich recht umständlich aber so verstehe ich es wenigstens und es macht das was ich will.

    Danke für die Anregungen.

    Viele Grüße

    EDIT:
    Und ich finde die Methode geht auch wessentlich schneller als über Excel. Hab mal bis zur Zeile 5000 suchen lassen. Selbst von USB geht es sehr zügig.

    EDIT 2:
    Ein kleines (nicht ganz so wichtiges) Thema habe ich noch. Ist es Möglich den Text in einer Textbox nach dem "automatischen" Eintragen auf rechtsbündig zu stellen??? Als Bsp siehe Bild 1 so gibt er mir das immer aus egal was ich bei TextAlign eingebe. Bild 2 so will ich es stehen haben!

    Edit3: Hab die Einstellung gefunden. Man muss die Forms von der Textbox bei RightToLeft auf True setzen.
    Bilder
    • Bild1.jpg

      3,74 kB, 123×53, 2.310 mal angesehen
    • Bild2.jpg

      3,81 kB, 123×53, 2.355 mal angesehen

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Mitschy“ ()