Mit Visual Basic CSV Datei auslesen und in anderer Datei speichern

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Thepinky.

    Mit Visual Basic CSV Datei auslesen und in anderer Datei speichern

    Hallo,

    ich will eine komplette Excel.csv auslesen und erstmal in einer .txt Datei speichern, anschließend soll der Inhalt der Excel.csv gelöscht werden.
    Mit dem aktuellen Code wird lediglich die 1. Spalte ausgelesen wie kann ich es umsetzen, dass die ganze Excel.csv ausgelesen wird?

    Welches Dateiformat wäre sinnvoll zu wählen, um später wieder auf die ausgelesenen Daten zuzugreifen?

    VB.NET-Quellcode

    1. Imports System.IO
    2. Public Class Form1
    3. Private Sub CmdLesen_Click(sender As Object, e As EventArgs) Handles CmdLesen.Click
    4. Try
    5. Dim fs As New FileStream("E:\Messwerte.csv", FileMode.Open)
    6. Dim sr As New StreamReader(fs)
    7. LblAnzeige.Text = ""
    8. Dim anzahl = 0
    9. Do While sr.Peek() <> -1
    10. anzahl += 1
    11. Dim zeile = sr.ReadLine()
    12. Dim teil() = zeile.Split(";")
    13. Dim name = teil(0)
    14. LblAnzeige.Text &= $"{name} #"
    15. Loop
    16. sr.Close()
    17. Catch ex As Exception
    18. MessageBox.Show(ex.Message)
    19. End Try
    20. End Sub
    21. Private Sub CmdSchreiben_Click(sender As Object, e As EventArgs) Handles CmdSchreiben.Click
    22. Schreiben(FileMode.Create)
    23. End Sub
    24. Private Sub CmdAnhaengen_Click(sender As Object, e As EventArgs)
    25. Schreiben(FileMode.Append)
    26. End Sub
    27. Private Sub Schreiben(fm As FileMode)
    28. Try
    29. Dim fs As New FileStream("E:\datei.txt", fm)
    30. Dim sw As New StreamWriter(fs)
    31. sw.WriteLine(LblAnzeige.Text)
    32. sw.Close()
    33. LblAnzeige.Text = ""
    34. Catch ex As Exception
    35. Dim value = MessageBox.Show(ex.Message)
    36. End Try
    37. End Sub
    38. End Class
    @Thepinky Willkommen im Forum. :thumbup:
    Wie sieht die originale CSV-Datei aus?
    Was genau brauchst Du aus dieser Datei?
    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 Hallo und danke für die erste Antwort!

    Anbei ein Schema der Excel-CSV Datei.
    Ergänzend möchte ich noch dazu sagen, es werden von einem System Messwerte darin gespeichert. Mir wäre es am liebsten wenn das System die CSV-Datei bei jeder neuen Messung überschreiben würde, aber das gibt das System nicht her sondern ergänzend die Datei.

    A4 - G4 sind immer gleich!
    H1-5 müsste ich übertragen, sowie A5

    Eine weitere Schwierigkeit, wurde die Übertragung samt gewollter Löschung einmal nicht ausgeführt, schreibt das System in Zeile sechs den nächsten Artikel.

    A
    BCDEFGH
    NameZeitNummer



    SCI
    Sollwert





    44,1
    Obergrenze





    0,1
    Untergrenze





    -0,1
    Deckel_oben





    44,088








    CSV-Datei die ausgelesen werden soll:

    Name der Messeinstellungsdaten;Messzeit;Losnummer;laufenden Zähler;OK/N.i.O.;Verantwortliche/r;Nummer;SCi
    Sollwert;;;;;;;44,1
    Obergrenze;;;;;;;0,1
    Untergrenze;;;;;;;-0,1
    Deckel_oben;22.03.2023 11:14;;1;OK;;1;44,088

    Gewünschtes Ergebnis:

    [Kopfdaten]
    Messprogramm=Deckel_oben
    Datum=22.03.2023 11:14
    Uebertragungsvorgaenge=-1
    Anzahl Messwerte=1
    =
    [Messwert 1]
    Typ=Messwert
    Anzahl Bauteile=1
    Messwert=44,088
    Einheit=mm
    DimensionID=SCI
    Achse=M
    Sollwert=44,1
    Plus=0,100
    Minus=-0,100
    Abweichung=0,012
    Ergebnis=OK
    @Thepinky Wir schaffen das heute noch. ;)
    Welche Zeichenfolge(n) aus CSV-Datei die ausgelesen werden soll:
    kommunizieren mit welchen Zeichenfolgen aus Gewünschtes Ergebnis:?
    Welche Zeichenfolgen in Gewünschtes Ergebnis: hast Du selbst eingefügt?
    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!
    Erstmal danke für eure Geduld! :)
    Ich denke man merkt, dass ich relativ neu auf dem Gebiet bin, aber mir macht es Spaß.

    Ok, blenden wir meinen Code einmal komplett aus und stellen uns vor, dass wir nur die CSV-Datei vorliegen haben.

    Diese sieht im Text Editor so aus:

    Name der Messeinstellungsdaten;Messzeit;Losnummer;laufenden Zähler;OK/N.i.O.;Verantwortliche/r;Nummer;SCi
    Sollwert;;;;;;;44,1
    Obergrenze;;;;;;;0,1
    Untergrenze;;;;;;;-0,1
    Deckel_oben;22.03.2023 11:14;;1;OK;;1;44,088

    Jetzt möchte ich diese auslesen und unter einem anderen Dateipfad und vielleicht als .pcr Datei oder etwas anderes sinnvolles speichern.

    [Kopfdaten]
    Messprogramm=Deckel_oben
    Datum=22.03.2023 11:14
    Typ=Messwert
    Anzahl Bauteile=1
    Messwert=44,088
    Einheit=mmDimensionID=SCI
    Sollwert=44,1
    Plus=0,100
    Minus=-0,100
    Ergebnis=OK

    Alles Variablen die in die neue Datei geschrieben werden sollen sind gleichfarbig markiert, alles was schwarz ist könnten ja konstante sein stehen bleiben.
    Kann ich die Werte nicht "einfach" z.B. in eine .pcr Datei speichern?

    Habe das Gefühl, dass ich entweder vieeel zu kompliziert oder zu einfach denke! 8o
    @Thepinky Vorschlag, sieh Dir den Code ganz genau an und frage, wenn Du was nicht verstehst.
    In meinem Beispiel wird eine XML-Datei geschrieben.
    Form, Datenklasse, Resultat-XML-Datei.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. Dim daten As New Kopfdaten
    4. Dim Flag As Boolean = False
    5. For Each line In IO.File.ReadLines("d:\Temp\Thepinky.csv")
    6. If line.StartsWith("Name der Messeinstellungsdaten") Then
    7. daten.DimensionID = GetLastString(line)
    8. ElseIf line.StartsWith("Sollwert") Then
    9. daten.Sollwert = GetLastDouble(line)
    10. ElseIf line.StartsWith("Obergrenze") Then
    11. daten.Plus = GetLastDouble(line)
    12. ElseIf line.StartsWith("Untergrenze") Then
    13. daten.Minus = GetLastDouble(line)
    14. Flag = True
    15. ElseIf Flag Then
    16. Dim parts() = line.Split(";"c)
    17. If parts.Count <> 8 Then
    18. Throw New ApplicationException("Falscher Inhalt")
    19. End If
    20. daten.Typ = "Messwert"
    21. daten.Messprogramm = parts(0)
    22. daten.Datum = DateTime.Parse(parts(1))
    23. daten.AnzahlBauteile = Integer.Parse(parts(3)) ' Index Überprüfen
    24. daten.Ergebnis = parts(4)
    25. daten.Messwert = Double.Parse(parts(7))
    26. Flag = False
    27. If MessageBox.Show("Speichern?", "Feddich", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = DialogResult.Yes Then
    28. Dim path = "d:\Temp\Thepinky.xml"
    29. daten.WriteData(path)
    30. End If
    31. End If
    32. Next
    33. End Sub
    34. Private Function GetLastString(line As String) As String
    35. Dim Index = line.LastIndexOf(";")
    36. Return line.Substring(Index)
    37. End Function
    38. Private Function GetLastDouble(line As String) As Double
    39. Dim Index = line.LastIndexOf(";")
    40. Return Double.Parse(line.Substring(Index + 1))
    41. End Function
    42. End Class

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports System.Text
    3. Imports System.Xml.Serialization
    4. ''' <summary>
    5. ''' Datenklasse
    6. ''' </summary>
    7. ''' <remarks>mit XML-Serialisierung</remarks>
    8. Public Class Kopfdaten
    9. ' Pfad zur geladenen Datei
    10. Private MyFile As String
    11. ' alle vorkommenden Daten
    12. Public Property Messprogramm() As String
    13. Public Property Datum() As DateTime
    14. Public Property Typ() As String
    15. Public Property AnzahlBauteile() As Integer
    16. Public Property Messwert() As Double
    17. Public Property Sollwert() As Double
    18. Public Property Einheit() As String
    19. Public Property DimensionID() As String
    20. Public Property Plus() As Double
    21. Public Property Minus() As Double
    22. Public Property Ergebnis() As String
    23. Public Sub New()
    24. ' Parameterloser Konstruktor zum Serialisieren
    25. End Sub
    26. ''' <summary>
    27. ''' Daten aus einer Datei lesen
    28. ''' </summary>
    29. ''' <param name="file">Dateiname</param>
    30. ''' <returns>die geladene Instanz</returns>
    31. Public Shared Function LoadData(file As String) As Kopfdaten
    32. Dim data As New Kopfdaten()
    33. Try
    34. ' Deserialize XML file to a new object.
    35. Using sr As New StreamReader(file, Encoding.Default)
    36. Dim x As New XmlSerializer(data.GetType())
    37. data = DirectCast(x.Deserialize(sr), Kopfdaten)
    38. End Using
    39. ' Pfad merken
    40. data.MyFile = file
    41. Return data
    42. Catch
    43. ' nix tun, die Daten-Instanz ist nicht valid,
    44. ' es wird die Instanz übergeben, die bei New() erzeugt wird
    45. End Try
    46. ' Pfad bei nicht vorgandener Instanz merken
    47. data.MyFile = file
    48. Return data
    49. End Function
    50. ''' <summary>
    51. ''' vorhandene Datei überschreiben
    52. ''' </summary>
    53. Public Sub WriteData()
    54. ' Serialize object to a XML file.
    55. Using sw As New StreamWriter(Me.MyFile, False, Encoding.Default)
    56. Dim x As New XmlSerializer(Me.GetType())
    57. x.Serialize(sw, Me)
    58. End Using
    59. End Sub
    60. ''' <summary>
    61. ''' Daten in eine neue Datei schreiben
    62. ''' </summary>
    63. Public Sub WriteData(path As String)
    64. ' Serialize object to a XML file.
    65. Using sw As New StreamWriter(path, False, Encoding.Default)
    66. Dim x As New XmlSerializer(Me.GetType())
    67. x.Serialize(sw, Me)
    68. End Using
    69. End Sub
    70. End Class

    XML-Quellcode

    1. <?xml version="1.0" encoding="Windows-1252"?>
    2. <Kopfdaten xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    3. <Messprogramm>Deckel_oben</Messprogramm>
    4. <Datum>2023-03-22T11:14:00</Datum>
    5. <Typ>Messwert</Typ>
    6. <AnzahlBauteile>1</AnzahlBauteile>
    7. <Messwert>44.088</Messwert>
    8. <Sollwert>44.1</Sollwert>
    9. <DimensionID>;SCi</DimensionID>
    10. <Plus>0.1</Plus>
    11. <Minus>-0.1</Minus>
    12. <Ergebnis>OK</Ergebnis>
    13. </Kopfdaten>
    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!
    Eine VBA-Lösung:

    Visual Basic-Quellcode

    1. Option Explicit
    2. Sub csv2txt()
    3. Dim Datei$, DAus$, tmp$
    4. Dim ar1$(), ar2$(), ar3$(), ar4$(), ar5$()
    5. Dim Plus$, Minus$, ABW$, MW$, SW$
    6. Dim i&
    7. i = 0
    8. Datei = "d:\#1\data.csv" '<--- anpassen
    9. DAus = "d:\#1\data.txt"
    10. Open Datei For Input As #1
    11. While Not EOF(1)
    12. Line Input #1, tmp
    13. i = i + 1
    14. If i = 1 Then
    15. ar1 = Split(tmp, ";")
    16. ElseIf i = 2 Then
    17. ar2 = Split(tmp, ";")
    18. ElseIf i = 3 Then
    19. ar3 = Split(tmp, ";")
    20. ElseIf i = 4 Then
    21. ar4 = Split(tmp, ";")
    22. ElseIf i = 5 Then
    23. ar5 = Split(tmp, ";")
    24. End If
    25. Wend
    26. Close
    27. Plus = Replace(ar3(7), ",", ".")
    28. Plus = Format$(Val(Plus), "0.000")
    29. Plus = Replace$(Plus, ".", ",")
    30. Minus = Replace(ar4(7), ",", ".")
    31. Minus = Format$(Val(Minus), "0.000")
    32. Minus = Replace$(Minus, ".", ",")
    33. MW = Replace(ar5(7), ",", ".")
    34. SW = Replace(ar2(7), ",", ".")
    35. ABW = Format$((Val(SW) - Val(MW)), "0.000")
    36. ABW = Replace(ABW, ".", ",")
    37. Open DAus For Output As #2
    38. Print #2, "[Kopfdaten]"
    39. Print #2, "Messprogramm=" & ar5(0)
    40. Print #2, "Datum=" & ar5(1)
    41. Print #2, "Typ=Messwert"
    42. Print #2, "Anzahl Bauteile=" & ar5(3) '? oder ar5(6)?
    43. Print #2, "Messwert=" & ar5(7)
    44. Print #2, "Einheit=mmDimensionID=" & ar1(7)
    45. Print #2, "Sollwert=" & ar2(7)
    46. Print #2, "Plus=" & Plus
    47. Print #2, "Minus=" & Minus
    48. Print #2, "Abweichung=" & ABW
    49. Print #2, "Ergebnis=" & ar5(4)
    50. Close
    51. 'csv-Datei löschen
    52. '''' Kill Datei 'Vorsicht
    53. End Sub


    Quelle: data.csv

    Quellcode

    1. Name der Messeinstellungsdaten;Messzeit;Losnummer;laufenden Zähler;OK/N.i.O.;Verantwortliche/r;Nummer;SCi
    2. Sollwert;;;;;;;44,1
    3. Obergrenze;;;;;;;0,1
    4. Untergrenze;;;;;;;-0,1
    5. Deckel_oben;22.03.2023 11:14;;1;OK;;1;44,088

    Ergebnis: data.txt

    Quellcode

    1. [Kopfdaten]
    2. Messprogramm=Deckel_oben
    3. Datum=22.03.2023 11:14
    4. Typ=Messwert
    5. Anzahl Bauteile=1
    6. Messwert=44,088
    7. Einheit=mmDimensionID=SCi
    8. Sollwert=44,1
    9. Plus=0,100
    10. Minus=-0,100
    11. Abweichung=0,012
    12. Ergebnis=OK