CSV mehrere Zellen automatisch mit Werten füllen

  • VB.NET

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von Eierlein.

    CSV mehrere Zellen automatisch mit Werten füllen

    Hallo VB'ler Experten,

    Ich möchte folgendens Realisieren und benötige hier ein wenig Hilfe.

    Es wird eine CSV Datei in eine DataGridView eingelesen, was mehr oder weniger auch funktioniert.



    Nun würde ich gerne per button klick z.b die komplette spalte 3 automatisch mit einem Wert füllen z.b mit einer 2.

    Habe schon sehr viel versucht aber irgendwie komm ich nicht auf die lösung.
    Willkommen im Forum. :thumbup:

    Mukkes schrieb:

    in eine DataGridView eingelesen
    ist suboptimal.
    Erstell Dir aus der CSV eine typisierte DataTable und binde die als DataSource an das DGV.
    Gearbeitet wird dann nur noch auf der Tabelle, das DGV dient nur der Anzeige.
    Probier dies mal 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!
    Vielen Dank für den Tipp :thumbup: aber leider komme ich da nicht weiter.

    Folgendes habe ich gedacht was mein kleinen tool können sollte.

    Ich habe eine Fertige CSV-Datei im header steht "LiefName;ArtikelNr;Bezeichnung;Bestand;Verkaufspreis" das wollte ich nun per code ändern in "supplier;ordernumber;description_long;instock;price"

    Danach z.b die Spalte "instock" automatisch mit werten füllen und anschließend als neue CSV abspeichern.

    Hätte da jemand eine Idee wie ich dies umsetzen könnte ?

    Mukkes schrieb:

    was mein kleinen tool können sollte
    und

    Mukkes schrieb:

    Ich habe eine Fertige CSV-Datei
    passt nicht zusammen, weil Du bereits eine fertige Lösung präferierst, die Grütze ist. Wenn Du bereit bist, Dein Programm neu aufzusetzen, und zwar erst dann, wenn die Aufgabenstellung und das Design klar sind, wirst Du an Deinem Programm und unserer Hilfe jede Menge Freude haben.
    Und Du hast gelernt, was eigentlich am wichtigsten ist. :thumbsup:
    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!

    RodFromGermany schrieb:

    Dein Programm neu aufzusetzen, und zwar erst dann, wenn die Aufgabenstellung und das Design klar sind, wirst Du an Deinem Programm und unserer Hilfe jede Menge Freude haben.


    Ja dazu bin ich gerne bereit :)

    Also ich habe ein Warenwirtschaftssystem, wenn ich da auf Artikel Export klicke bekomme ich diese fertig CSV.
    Diese CSV möchte ich dann in meinen Online Shop importieren was aber nicht funktioniert da der Header in der CSV falsch ist und noch eine spalte dazu gemacht werden muss.

    Das WWS liefert mir die CSV mit folgendem Header:

    "LiefName;ArtikelNr;Bezeichnung;Bestand;Verkaufspreis"

    So kann ich diese aber nicht im Shop importieren denn der Header müsste so aussehen:

    "supplier;ordernumber;description_long;instock;price"

    Leider kann ich den Header auch nicht im WWS umstellen damit ich vom WWS die richtige CSV bekomme.

    Dazu braucht der Shop noch die Spalte "tax" und die der müsste mit dem Wert "19" gefüllt werden bis ans ende der CSV.

    Damit ich dieses nicht jedes Mal von Hand ändern muss, wollte ich mir da ein kleines Tool erstellen der dies für mich übernimmt.
    Also die fertige CSV vom WWS laden dann bearbeiten und neu abspeichern damit ich sie im Shop importieren kann.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Mukkes“ ()

    also du willst nur die erste Zeile mit den Überschriften austauschen?
    Das ist ein bischen String-Verarbeitung - sowas musste nichtmal in ein DGV oder sonstwohin laden.

    Kannst du eine Datei zeilenweise einlesen, und eine annere zeilenweise wegschreiben?

    Code?


    Dabei könnte man dann die erste Zeile manipulieren.

    ErfinderDesRades schrieb:

    also du willst nur die erste Zeile mit den Überschriften austauschen?


    Ja genau

    ErfinderDesRades schrieb:

    Kannst du eine Datei zeilenweise einlesen, und eine annere zeilenweise wegschreiben?

    Code?


    Nein weiß nicht wie ich das machen muss.

    Ein Code hab ich auch nicht mehr da ich das projekt neu beginne.
    Dazu braucht der Shop noch die Spalte "tax" und die der müsste mit dem Wert "19" gefüllt werden bis ans ende der CSV.


    Hier eine VBA Lösung:

    Visual Basic-Quellcode

    1. Option Explicit
    2. Sub test()
    3. Dim t As String
    4. Dim FF1 As Integer
    5. Dim FF2 As Integer
    6. FF1 = FreeFile
    7. Open "c:\##\test.csv" For Input As #FF1
    8. FF2 = FreeFile
    9. Open "c:\##\neu.csv" For Output As #FF2
    10. Print #FF2, "supplier;ordernumber;description_long;instock;price;tax"
    11. If Not EOF(FF1) Then Line Input #FF1, t
    12. While Not EOF(FF1)
    13. Line Input #FF1, t
    14. If Len(t) Then
    15. Print #FF2, t; ";19"
    16. End If
    17. Wend
    18. Close
    19. End Sub
    So habe mal was versucht und es funktioniert auch soweit.

    Denke mal das ist eine möglichkeit wie man es lösen könnte.

    Was meint ihr dazu ?

    VB.NET-Quellcode

    1. Imports System.IO
    2. Public Class Form1
    3. 'Öffnen
    4. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    5. OpenFileDialog1.Filter = "CSV files (*.csv)|*.csv|All files (*.*)|*.*"
    6. openFileDialog1.FilterIndex = 1
    7. openFileDialog1.RestoreDirectory = True
    8. openFileDialog1.FileName = "Datei öffnen"
    9. OpenFileDialog1.ShowDialog()
    10. End Sub
    11. 'Ändern
    12. Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    13. Dim CSVDateiInhalte As String
    14. Dim R As New IO.StreamReader(OpenFileDialog1.FileName)
    15. CSVDateiInhalte = R.ReadToEnd
    16. CSVDateiInhalte =
    17. CSVDateiInhalte.Replace("LiefName;ArtikelNr;Bezeichnung;Bestand;Verkaufspreis",
    18. "supplier;ordernumber;description_long;instock;price")
    19. R.Close()
    20. MsgBox("Erfolgreich", 64, "Information!")
    21. 'Speichern
    22. SaveFileDialog1.Filter = "CSV Files (*.csv*)|*.csv"
    23. If SaveFileDialog1.ShowDialog = DialogResult.OK Then
    24. Dim Wr As IO.StreamWriter = New IO.StreamWriter(SaveFileDialog1.FileName)
    25. Wr.Write(CSVDateiInhalte)
    26. Wr.Close()
    27. End If
    28. End Sub
    29. End Class


    Vielen Dank Eierlein für den Code aber wie kann ich den denn nun bei mir einfügen ?
    na, ist doch schoma was :thumbsup:
    Nu kann man verbessern:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub btChooseCsv_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btChooseCsv.Click
    3. OpenFileDialog1.ShowDialog()
    4. End Sub
    5. 'Ändern
    6. Private Sub btSaveChangedCsv_Click(sender As Object, e As EventArgs) Handles btSaveChangedCsv.Click
    7. Dim lines = File.ReadAllLines(OpenFileDialog1.FileName)
    8. lines(0) = "supplier;ordernumber;description_long;instock;price"
    9. If SaveFileDialog1.ShowDialog = DialogResult.OK Then
    10. File.WriteAllLines(SaveFileDialog1.FileName, lines)
    11. End If
    12. End Sub
    13. End Class
    Wichtige Punkte:
    1. Benamung - ganz wichtig! Nenn die Buttons wie das was sie tun, und jeder versteht auf einmal dein Proggi auf Anhieb.
    2. Stell die Dialoge im Designer ein, dann konzentriert dein Code sich aufs wesentliche.
    3. vor allem: deaktiviere die "Deppen-Einstellungen" in deim VisualStudio Visual Studio - Empfohlene Einstellungen

    PS: Meine Umarbeitung deines Codes ist noch sehr unsicher, also wenn der User die falsche Csv öffnet, oder wenn die Header nicht wirklich zuverlässig in der ersten Zeile stehen, stürztes nichtmal ab, sondern es entsteht durch Daten-Korrumpierung sogar u.U. erheblicher Schaden.
    Bau etwas ein, was die erste Zeile testet, und wenn die dem Schema nicht entspricht, zeige die Csv dem User an, dasser selbst gucken kann, was faul ist.

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

    ErfinderDesRades schrieb:

    vor allem: deaktiviere die "Deppen-Einstellungen" in deim VisualStudio Visual Studio - Empfohlene Einstellungen


    Habe ich gemacht 8)

    So habe dann auch mal den Code ein wenig weiter bearbeitet

    VB.NET-Quellcode

    1. Public Class Form1
    2. Const ANZAHLSPALTEN As Integer = 10
    3. Const TRENNZEICHEN As Char = CChar(";")
    4. Private Sub btChooseCsv_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btChooseCsv.Click
    5. OpenFileDialog1.ShowDialog()
    6. End Sub
    7. Private Sub btSaveChangedCsv_Click(sender As Object, e As EventArgs) Handles btSaveChangedCsv.Click
    8. Dim lines = File.ReadAllLines(OpenFileDialog1.FileName)
    9. Dim txt = "LiefName;ArtikelNr;Bezeichnung;Bestand;Verkaufspreis"
    10. Dim line = New List(Of String)
    11. line.AddRange(IO.File.ReadAllLines(OpenFileDialog1.FileName))
    12. If line.Contains(txt) Then
    13. lines(0) = "supplier;ordernumber;description_long;instock;price"
    14. If SaveFileDialog1.ShowDialog = DialogResult.OK Then
    15. File.WriteAllLines(SaveFileDialog1.FileName, lines)
    16. End If
    17. Else
    18. MessageBox.Show("Falsche CSV ausgewählt")
    19. Dim Felder() As String
    20. Dim Zeile As String
    21. Dim DATEINAME As String = OpenFileDialog1.FileName
    22. Dim dt = New DataTable()
    23. Dim sr = My.Computer.FileSystem.OpenTextFileReader(DATEINAME, System.Text.Encoding.Default)
    24. For i As Integer = 1 To ANZAHLSPALTEN
    25. dt.Columns.Add("Spalte " & i)
    26. Next
    27. Do While (sr.Peek > -1)
    28. Zeile = sr.ReadLine
    29. Felder = Zeile.Split(TRENNZEICHEN)
    30. Dim dr As DataRow = dt.NewRow
    31. dr.ItemArray = Felder
    32. dt.Rows.Add(dr)
    33. Loop
    34. DGV.DataSource = dt
    35. End If
    36. End Sub
    37. End Class


    Eierlein schrieb:

    In den VBA-Editor von Excel oder Word.
    Pfade und Dateinamen anpassen, starten und prüfen, ob die neu erstellte Datei deinen Vorstellungen entspricht.


    Ja das habe ich auch nun raus gefunden das es in Excel muss.

    Habe es auch mal getestet funzt auch soweit ganz gut. Danke nochmal dafür :thumbup:

    Nur das müsste in meinem tool schon mit drin sein sonst müsste ich das ja zuerst in Excel ausführen und dann in meinem tool.
    auch das schwer verbesserbar:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Const ANZAHLSPALTEN As Integer = 10
    3. Const TRENNZEICHEN As Char = ";"c
    4. Private Sub btChooseCsv_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btChooseCsv.Click
    5. OpenFileDialog1.ShowDialog()
    6. End Sub
    7. Private Sub btSaveChangedCsv_Click(sender As Object, e As EventArgs) Handles btSaveChangedCsv.Click
    8. Dim lines = File.ReadAllLines(OpenFileDialog1.FileName)
    9. Dim txt = "LiefName;ArtikelNr;Bezeichnung;Bestand;Verkaufspreis"
    10. '
    11. 'Dim line = New List(Of String) 'komplett unnötig
    12. '
    13. Dim index = Array.IndexOf(lines, txt)
    14. If index < 0 Then
    15. MessageBox.Show("Falsche CSV ausgewählt")
    16. Textbox1.Lines = lines 'mehr braucht man nicht, um ein String-Array anzuzeigen
    17. Else
    18. lines(index) = "supplier;ordernumber;description_long;instock;price"
    19. If SaveFileDialog1.ShowDialog = DialogResult.OK Then
    20. File.WriteAllLines(SaveFileDialog1.FileName, lines)
    21. End If
    22. End If
    23. End Sub
    24. End Class
    1. Beachte die richtige Notation eines Chars in vb - #4
    2. Füge keine sinnlosen Leerzeilen ein - das schafft nur Unübersichtlichkeit - eine Methode ist eine Einheit und soll auch so aussehen.
    3. Lies die Datei nur einmal ein (bei dir: #12, #18)
    4. Wenn du die Header-Zeile suchst, dann tausche auch genau am Index aus, wo du sie gefunden hast (#21).
    5. Das ganze Geraffel mittm DGV kannste dir sparen: Eine Textbox zeigt die Datei genau, wie sie ist, und das ebensogut oder besser, als der Versuch, die Daten in ein DGV zu überführen
      Ups - damit ist bei mir Zeilen #3,#4 auch üflüssig
    6. Sieh immer zu, möglichst wenig Code zu schreiben (also übertreibs damit nicht, aber ein Problem in weniger Zeilen gelöst ist üblicherweise vielfach leichter verständlich und auch stabiler. bzw annersrum: kurz formulierte Lösungen sind üblicherweise ein Zeichen guten Codes)

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

    Okay Vielen Dank :thumbup:

    Ich denke mal das man es nun so lassen kann da es ja sein sinn erfüllt.

    Wüsste auch nicht was man noch dazu machen könnte.

    Fehlt mir nur noch die erweiterung der Spalte "tax" und die müsste mit dem Wert "19" gefüllt werden bis ans ende der CSV.

    Aber da weiß ich nicht wie ich das machen kann.

    Der Code von Eierlein ist gut aber den müsste ich dann immer danach in Excel ausführen.
    Hier noch ein ausführbares Consolenprogramm.
    Pfad und Dateinamen anpassen.

    VB.NET-Quellcode

    1. Imports System
    2. Imports System.IO
    3. Imports System.Text
    4. Module Module1
    5. Sub Main()
    6. Dim datei As String = "c:\##\test.csv"
    7. Dim dateiNeu As String = "c:\##\neu.csv"
    8. Dim lines() As String = File.ReadAllLines(datei, encoding.default)
    9. Dim txt As String = "LiefName;ArtikelNr;Bezeichnung;Bestand;Verkaufspreis"
    10. If lines(0).Contains(txt) Then
    11. lines(0) = "supplier;ordernumber;description_long;instock;price;tax"
    12. For i As Integer = 1 To lines.Length - 1
    13. lines(i) &= ";19"
    14. Next
    15. File.WriteAllLines(dateiNeu, lines, Encoding.Default)
    16. 'Kann entfallen, wenn du nur das DGV brauchst
    17. Else
    18. MsgBox("Falsche CSV ausgewählt")
    19. 'Abbruch
    20. End If
    21. 'Und gleich weiter
    22. 'For i As Integer = 1 To ANZAHLSPALTEN
    23. ' dt.Columns.Add("Spalte " & i)
    24. 'Next
    25. 'For i As Integer = 0 To lines.Length - 1
    26. ' Felder = lines(i).Split(TRENNZEICHEN)
    27. ' Dim dr As DataRow = dt.NewRow
    28. ' dr.ItemArray = Felder
    29. ' dt.Rows.Add(dr)
    30. 'Next
    31. 'DGV.DataSource = dt
    32. End Sub
    33. End Module