Mehrdimensionales String Array speichern und lesen

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von Elephant.

    schau mal hier ^^

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim MeinArray As Char(,) = {{"a"c, "b"c}, {"c"c, "d"c}, {"e"c, "f"c}} ' 3×2 Array
    3. For i As Integer = 0 To 2 Step 1
    4. For j As Integer = 0 To 1 Step 1
    5. Debug.WriteLine(MeinArray(i, j))
    6. Next
    7. Next
    8. End Sub


    \begin{bmatrix} a & b \\ c & d \\ e & f \end{bmatrix}

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Bartosz“ ()

    Da gibt es viele Ansätze. Daher kommt es drauf an was für eine Array das es ist, und wie sie gespeichert werden soll.

    Sofern es immer der gleiche Array-Typ ist, und es auf die HD gespeichert werden soll, so kann man das schon mit einer Serialisierung machen.

    Wenn es Arrays sind, unter Umstände sogar verschiedene Datentypen dann würde ich mit StreamReader, Streamwriter , BinaryReader oder BinaryWriter arbeiten.

    Aber wie gesagt. Wir müssten wissen, was du genau vor hast und was für Array das es sind.

    Freundliche Grüsse

    exc-jdbi

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „exc-jdbi“ ()

    exc-jdbi schrieb:

    Da gibt es viele Ansätze.

    Hier mal die Dimensionierung
    Dim InfoText(100, 2)

    Mal so nebenbei, ein eindimensionales Array kann ich Dimensionieren ohne zu wissen wie viele Elemente es werden. Würde das auch hier gehen und wenn ja wie?

    Aber nun wieder zum Thema.
    In dem String werden zwei Infos gespeichert und auch angezeigt, das dritte wird nur vom Programm verwendet.

    Das mit den vielen Ansätzen hört sich so an als muss man sich was basteln.

    Mein erste Gedanke wäre:

    VB.NET-Quellcode

    1. Dim Speichern As String
    2. For i = 0 To Anzahl
    3. Speichern = Speichern & InfoText(i, 0) & Environment.NewLine
    4. Next
    5. My.Computer.FileSystem.WriteAllText("C:\Speicherort\Infotext1.txt", Speichern, False)
    6. 'Zum lesen
    7. Dim filelesen As String = My.Computer.FileSystem.ReadAllText("C:\Speicherort\Infottext1.txt")
    8. Dim LesenString() As String = filelesen.Split(Environment.NewLine)

    und das halt 3-mal.

    Wobei wenn man sich eh was basteln muss, könnte ich es auch so Regeln das ich 3 String Arrays nehme.
    Wobei ich da auch nicht wüsste wie man ein eindimensionales String Array speichert und liest.
    Also du baust dir ein txt-File? Was direkt auffällt an dem Split ist, dass du File.ReadAllLines nicht kennst. Das würde dir direkt den LesenString() ausgeben, den du dir mit Split "bastelst"

    genauso kannst auch mit .WriteAllLines Arbeit sparen.

    Ich muss allerdings zugeben ich hab noch nicht ganz verstanden wie die Txt am Ende aussehen soll.

    Was du mit Array speichern meinst ist auch nicht klar, vermutlich willst du den Inhalt des Arrays in einer Txt speichern, danach sieht dein Code aus.

    So pack ich drei Worte nach Zeilen geteilt in ne txt:

    VB.NET-Quellcode

    1. Dim dreiworte as String() = {"Hallo","I","bims"}
    2. File.WriteAllLines("C:\Speicherort\dreiworte.txt", dreiworte)

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

    @'Elephant' Haudruferzappeltnoch war etwas schneller, was ReadAllLines etc angeht, aber ich möchte dir meine Antwort nicht vorenthalten ^^

    Du bist dir nicht sicher, wie viele Zeilen eingelesen werden werden? Kein Problem: StringArray = (New String(RAL1.Length - 1, 2) {})

    speichern und laden

    VB.NET-Quellcode

    1. Imports Microsoft.VisualBasic.ControlChars
    2. Imports Microsoft.WindowsAPICodePack.Dialogs
    3. Public Class FormMain
    4. Private ReadOnly Deu As New System.Globalization.CultureInfo("de-DE")
    5. Private StringArray As String(,)
    6. Private Sub FormMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    7. Label_loadingstate.Text = ""
    8. End Sub
    9. Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button_load.Click
    10. Dim file_path As String = ""
    11. Using OFD As New CommonOpenFileDialog
    12. OFD.Title = "Ordner, in dem die Datensätze-Textdateien sind, auswählen"
    13. Dim di As New IO.DirectoryInfo(Application.StartupPath)
    14. If di.Parent.Name = "bin" Then
    15. di = di.Parent.Parent.Parent ' AnyCPU
    16. ElseIf di.Parent.Parent.Name = "bin" Then
    17. di = di.Parent.Parent.Parent.Parent ' x64, x86
    18. End If
    19. If System.IO.Directory.Exists(di.FullName) Then
    20. OFD.InitialDirectory = di.FullName
    21. Else
    22. OFD.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop)
    23. End If
    24. OFD.Filters.Add(New CommonFileDialogFilter("Textdateien", ".txt"))
    25. If OFD.ShowDialog() = CommonFileDialogResult.Ok Then
    26. file_path = OFD.FileName
    27. Else
    28. Return
    29. End If
    30. End Using
    31. If (Await Read_data(file_path)) Then
    32. Label_loadingstate.Text = "Daten vollständig geladen"
    33. Else
    34. Label_loadingstate.Text = "Daten nicht vollständig geladen"
    35. End If
    36. End Sub
    37. Private Async Function Read_data(ByVal file_path As String) As Task(Of Boolean)
    38. Return Await Task.Run(Function() ReadData(file_path))
    39. End Function
    40. Private Function ReadData(ByVal file_path As String) As Boolean
    41. Dim RAL1 As String() = System.IO.File.ReadAllLines(file_path, System.Text.Encoding.UTF8)
    42. StringArray = (New String(RAL1.Length - 1, 2) {})
    43. For i As Integer = 0 To RAL1.Length - 1 Step 1
    44. Dim parts As String() = RAL1(i).Split({Tab})
    45. For j As Integer = 0 To 2 Step 1
    46. StringArray(i, j) = parts(j)
    47. Next
    48. Next
    49. Return True
    50. End Function
    51. Private Sub Button_save_Click(sender As Object, e As EventArgs) Handles Button_save.Click
    52. Dim file_path As String
    53. Using SFD1 As New CommonSaveFileDialog
    54. SFD1.Title = "Daten speichern"
    55. SFD1.Filters.Add(New CommonFileDialogFilter("Textdatei", ".txt"))
    56. Dim di As New IO.DirectoryInfo(Application.StartupPath)
    57. If di.Parent.Name = "bin" Then
    58. di = di.Parent.Parent.Parent ' AnyCPU
    59. ElseIf di.Parent.Parent.Name = "bin" Then
    60. di = di.Parent.Parent.Parent.Parent ' x64, x86
    61. End If
    62. If System.IO.Directory.Exists(di.FullName) Then
    63. SFD1.InitialDirectory = di.FullName
    64. Else
    65. SFD1.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop)
    66. End If
    67. If SFD1.ShowDialog() = CommonFileDialogResult.Ok Then
    68. file_path = SFD1.FileName & ".txt"
    69. Else
    70. Return
    71. End If
    72. End Using
    73. save_Data(file_path)
    74. End Sub
    75. Private Sub save_Data(ByVal file_path As String)
    76. Using textfile As System.IO.StreamWriter = My.Computer.FileSystem.OpenTextFileWriter(file_path, True, System.Text.Encoding.UTF8)
    77. For i As Integer = 0 To 99 Step 1
    78. textfile.WriteLine(i.ToString(Deu).PadLeft(2, "0"c) & Tab & "Hallo" & Tab & "Test") 'Dies ist natürlich nur ein Lückenfüller, TAB-Zeichen-getrennt, um irgendetwas in die Textdatei zu schreiben.
    79. Next
    80. textfile.Close()
    81. End Using
    82. End Sub
    83. End Class



    Wenn du mehrere Dateien hast (du sagtest drei), dann nimmst du den Code drei Mal untereinander.

    Die Einlesen-Prozedur ist asynchron. Ist für 100 Zeilen vielleicht etwas übertrieben, aber wenn über 1000 Zeilen in der Datei stehen, dann macht sich das bemerkbar. Und noch ein Hinweis: Ich habe OpenFileDialoge eingebunden. Hard-gecodete Pfade ("C:\Speicherort\Infotext1.txt") gehen gar nicht.
    Bilder
    • gespeicherte Textdatei.png

      42,59 kB, 788×838, 62 mal angesehen
    • runtime debugging.jpg

      61,75 kB, 520×348, 61 mal angesehen
    @Elephant Bau Dir eine Datenklasse und serialisiere die.
    Binär oder Xml: docs.microsoft.com/de-de/dotne…e/concepts/serialization/
    Feddich.
    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!
    Morgen @Elephant

    Schau dir kurz die Möglichkeiten an.

    Freundliche Grüsse

    exc-jdbi

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Strict On
    2. Option Explicit On
    3. Imports System.IO
    4. Imports System.Text
    5. Imports System.Runtime.Serialization.Formatters.Binary
    6. Public Module ElephantSaveArray
    7. Private ReadOnly Rand As Random = New Random
    8. Public Sub Main()
    9. Dim size = 100
    10. Dim length = 3
    11. Dim filema = "datama"
    12. TestMultiArray(filema, 100, 3)
    13. Dim fileja = "dataja"
    14. TestStringArray(fileja, 100, 3)
    15. End Sub
    16. Private Sub TestMultiArray(filename As String, size As Int32, length As Int32)
    17. 'Random MultiArray
    18. Dim rngarray = RngMultiArray(size, length)
    19. 'Speichern und Laden über Serialisierung
    20. SaveSourceSerialize(filename, rngarray)
    21. Dim newsrc = DirectCast(LoadSourceDeserialize(filename), String(,))
    22. 'Speichern und Laden über Streams
    23. SaveSource(filename, rngarray)
    24. Dim newsrc2 = LoadMultiArray(filename)
    25. End Sub
    26. Private Sub TestStringArray(filename As String, size As Int32, length As Int32)
    27. 'Random StringArray
    28. Dim rngarray = RngStringArray(size, length)
    29. 'Speichern und Laden über Serialisierung
    30. SaveSourceSerialize(filename, rngarray)
    31. Dim newsrc = DirectCast(LoadSourceDeserialize(filename), String())
    32. 'Speichern und Laden über Streams
    33. SaveSource(filename, rngarray)
    34. Dim newsrc2 = LoadStringArray(filename)
    35. End Sub
    36. Private Sub SaveSource(filename As String, source As String(,))
    37. Using fs = New FileStream(filename, FileMode.Create)
    38. Using sw = New StreamWriter(fs)
    39. Dim sb = New StringBuilder(source.GetLength(1))
    40. sw.WriteLine(source.GetLength(1))
    41. For i = 0 To source.GetLength(0) - 1
    42. For j = 0 To source.GetLength(1) - 1
    43. sb.Append(source(i, j))
    44. Next
    45. sw.WriteLine(sb.ToString)
    46. sb.Clear()
    47. Next
    48. End Using
    49. End Using
    50. End Sub
    51. Private Function LoadMultiArray(filename As String) As String(,)
    52. Using fs = New FileStream(filename, FileMode.Open)
    53. Using sr = New StreamReader(fs)
    54. Dim sb = New StringBuilder
    55. Dim nl = Environment.NewLine
    56. Dim length = Convert.ToInt32(sr.ReadLine)
    57. While Not sr.EndOfStream
    58. sb.AppendLine(sr.ReadLine)
    59. End While
    60. Dim split = sb.ToString.Split({nl}, StringSplitOptions.RemoveEmptyEntries)
    61. Dim result = New String(split.Length - 1, length - 1) {}
    62. For i = 0 To split.Length - 1
    63. For j = 0 To split(i).Length - 1
    64. result(i, j) = split(i)(j)
    65. Next
    66. Next
    67. Return result
    68. End Using
    69. End Using
    70. End Function
    71. Private Sub SaveSource(filename As String, source As String())
    72. Using fs = New FileStream(filename, FileMode.Create)
    73. Using sw = New StreamWriter(fs)
    74. For Each s In source
    75. sw.WriteLine(s)
    76. Next
    77. End Using
    78. End Using
    79. End Sub
    80. Private Function LoadStringArray(filename As String) As String()
    81. Using fs = New FileStream(filename, FileMode.Open)
    82. Using sr = New StreamReader(fs)
    83. Dim sb = New StringBuilder
    84. Dim nl = Environment.NewLine
    85. While Not sr.EndOfStream
    86. sb.AppendLine(sr.ReadLine)
    87. End While
    88. Return sb.ToString.Split({nl}, StringSplitOptions.RemoveEmptyEntries)
    89. End Using
    90. End Using
    91. End Function
    92. Private Sub SaveSourceSerialize(filename As String, source As Object)
    93. Using fs = New FileStream(filename, FileMode.Create)
    94. Try
    95. Dim formatter = New BinaryFormatter()
    96. formatter.Serialize(fs, source)
    97. Catch ex As Exception
    98. End Try
    99. End Using
    100. End Sub
    101. Private Function LoadSourceDeserialize(filename As String) As Object
    102. Using fs = New FileStream(filename, FileMode.Open)
    103. Try
    104. Dim formatter = New BinaryFormatter()
    105. Return formatter.Deserialize(fs)
    106. Catch ex As Exception
    107. End Try
    108. End Using
    109. Return Nothing
    110. End Function
    111. Private Function RngMultiArray(size As Int32, length As Int32) As String(,)
    112. Dim rngalpha = RngAlphaSource()
    113. Dim result = New String(size - 1, length - 1) {}
    114. For i = 0 To result.GetLength(0) - 1
    115. For j = 0 To result.GetLength(1) - 1
    116. result(i, j) = rngalpha(Rand.Next(rngalpha.Length))
    117. Next
    118. Next
    119. Return result
    120. End Function
    121. Private Function RngStringArray(size As Int32, length As Int32) As String()
    122. Dim sb As StringBuilder
    123. Dim rngalpha = RngAlphaSource()
    124. Dim result = New String(size - 1) {}
    125. For i = 0 To result.Length - 1
    126. sb = New StringBuilder(length)
    127. For j = 0 To length - 1
    128. sb.Append(rngalpha(Rand.Next(rngalpha.Length)))
    129. Next
    130. result(i) = sb.ToString
    131. Next
    132. Return result
    133. End Function
    134. Private Function RngAlphaSource() As String
    135. Return "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".
    136. OrderBy(Function(str) Rand.Next).ToArray
    137. End Function
    138. End Module


    Natürlich gehts auch so
    Spoiler anzeigen

    VB.NET-Quellcode

    1. ​Private Sub SaveSource2(filename As String, source As String(,))
    2. Using fs = New FileStream(filename, FileMode.Create)
    3. Using sw = New StreamWriter(fs)
    4. sw.WriteLine(source.GetLength(0))
    5. sw.WriteLine(source.GetLength(1))
    6. Dim sb = New StringBuilder(source.GetLength(1))
    7. For i = 0 To source.GetLength(0) - 1
    8. For j = 0 To source.GetLength(1) - 1
    9. sb.Append(source(i, j))
    10. Next
    11. sw.WriteLine(sb.ToString)
    12. sb.Clear()
    13. Next
    14. End Using
    15. End Using
    16. End Sub
    17. Private Function LoadMultiArray2(filename As String) As String(,)
    18. If Not File.Exists(filename) Then Return Nothing
    19. Using fs = New FileStream(filename, FileMode.Open)
    20. Using sr = New StreamReader(fs)
    21. Dim index = 0
    22. Dim size = Convert.ToInt32(sr.ReadLine)
    23. Dim length = Convert.ToInt32(sr.ReadLine)
    24. Dim result = New String(size - 1, length - 1) {}
    25. While Not sr.EndOfStream
    26. Dim line = sr.ReadLine
    27. For i = 0 To length - 1
    28. result(index, i) = line(i)
    29. Next
    30. index += 1
    31. End While
    32. Return result
    33. End Using
    34. End Using
    35. End Function
    36. Private Sub SaveSource2(filename As String, source As String())
    37. Using fs = New FileStream(filename, FileMode.Create)
    38. Using sw = New StreamWriter(fs)
    39. sw.WriteLine(source.Length)
    40. For Each s In source
    41. sw.WriteLine(s)
    42. Next
    43. End Using
    44. End Using
    45. End Sub
    46. Private Function LoadStringArray2(filename As String) As String()
    47. If Not File.Exists(filename) Then Return Nothing
    48. Using fs = New FileStream(filename, FileMode.Open)
    49. Using sr = New StreamReader(fs)
    50. Dim size = Convert.ToInt32(sr.ReadLine)
    51. Dim result = New String(size - 1) {}
    52. For i = 0 To result.Length - 1
    53. result(i) = sr.ReadLine
    54. Next
    55. Return result
    56. End Using
    57. End Using
    58. End Function

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „exc-jdbi“ ()

    Nur kurz zwei Sachen
    Es muss nicht als .txt gespeichert werden. Kann auch ein obskures Format sein.
    Wichtig ist nur das ich die Daten nach dem lesen wieder so im String Array habe wie sie vorher waren.
    Der Pfad war nur auf die schnelle für mein Gedanken.
    In wirklichkeit werden die Daten nie auf C landen und der Dateiname wird auch ein anderer sein und wie der Pfad nacher im Programm steht ist auch noch unbekannt.

    Für alles andere brauche ich etwas Zeit. Jetzt muß ich aber erstmal arbeiten.
    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!