Mehrdimensionales String Array speichern und lesen
- VB.NET
Sie verwenden einen veralteten Browser (%browser%) mit Sicherheitsschwachstellen und können nicht alle Funktionen dieser Webseite nutzen.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von Elephant.
-
-
schau mal hier ^^
\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-jdbiDieser 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
- Dim Speichern As String
- For i = 0 To Anzahl
- Speichern = Speichern & InfoText(i, 0) & Environment.NewLine
- Next
- My.Computer.FileSystem.WriteAllText("C:\Speicherort\Infotext1.txt", Speichern, False)
- 'Zum lesen
- Dim filelesen As String = My.Computer.FileSystem.ReadAllText("C:\Speicherort\Infottext1.txt")
- 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:
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
- Imports Microsoft.VisualBasic.ControlChars
- Imports Microsoft.WindowsAPICodePack.Dialogs
- Public Class FormMain
- Private ReadOnly Deu As New System.Globalization.CultureInfo("de-DE")
- Private StringArray As String(,)
- Private Sub FormMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load
- Label_loadingstate.Text = ""
- End Sub
- Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button_load.Click
- Dim file_path As String = ""
- Using OFD As New CommonOpenFileDialog
- OFD.Title = "Ordner, in dem die Datensätze-Textdateien sind, auswählen"
- Dim di As New IO.DirectoryInfo(Application.StartupPath)
- If di.Parent.Name = "bin" Then
- di = di.Parent.Parent.Parent ' AnyCPU
- ElseIf di.Parent.Parent.Name = "bin" Then
- di = di.Parent.Parent.Parent.Parent ' x64, x86
- End If
- If System.IO.Directory.Exists(di.FullName) Then
- OFD.InitialDirectory = di.FullName
- Else
- OFD.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop)
- End If
- OFD.Filters.Add(New CommonFileDialogFilter("Textdateien", ".txt"))
- If OFD.ShowDialog() = CommonFileDialogResult.Ok Then
- file_path = OFD.FileName
- Else
- Return
- End If
- End Using
- If (Await Read_data(file_path)) Then
- Label_loadingstate.Text = "Daten vollständig geladen"
- Else
- Label_loadingstate.Text = "Daten nicht vollständig geladen"
- End If
- End Sub
- Private Async Function Read_data(ByVal file_path As String) As Task(Of Boolean)
- Return Await Task.Run(Function() ReadData(file_path))
- End Function
- Private Function ReadData(ByVal file_path As String) As Boolean
- Dim RAL1 As String() = System.IO.File.ReadAllLines(file_path, System.Text.Encoding.UTF8)
- StringArray = (New String(RAL1.Length - 1, 2) {})
- For i As Integer = 0 To RAL1.Length - 1 Step 1
- Dim parts As String() = RAL1(i).Split({Tab})
- For j As Integer = 0 To 2 Step 1
- StringArray(i, j) = parts(j)
- Next
- Next
- Return True
- End Function
- Private Sub Button_save_Click(sender As Object, e As EventArgs) Handles Button_save.Click
- Dim file_path As String
- Using SFD1 As New CommonSaveFileDialog
- SFD1.Title = "Daten speichern"
- SFD1.Filters.Add(New CommonFileDialogFilter("Textdatei", ".txt"))
- Dim di As New IO.DirectoryInfo(Application.StartupPath)
- If di.Parent.Name = "bin" Then
- di = di.Parent.Parent.Parent ' AnyCPU
- ElseIf di.Parent.Parent.Name = "bin" Then
- di = di.Parent.Parent.Parent.Parent ' x64, x86
- End If
- If System.IO.Directory.Exists(di.FullName) Then
- SFD1.InitialDirectory = di.FullName
- Else
- SFD1.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop)
- End If
- If SFD1.ShowDialog() = CommonFileDialogResult.Ok Then
- file_path = SFD1.FileName & ".txt"
- Else
- Return
- End If
- End Using
- save_Data(file_path)
- End Sub
- Private Sub save_Data(ByVal file_path As String)
- Using textfile As System.IO.StreamWriter = My.Computer.FileSystem.OpenTextFileWriter(file_path, True, System.Text.Encoding.UTF8)
- For i As Integer = 0 To 99 Step 1
- 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.
- Next
- textfile.Close()
- End Using
- End Sub
- 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.
-
-
@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
- Option Strict On
- Option Explicit On
- Imports System.IO
- Imports System.Text
- Imports System.Runtime.Serialization.Formatters.Binary
- Public Module ElephantSaveArray
- Private ReadOnly Rand As Random = New Random
- Public Sub Main()
- Dim size = 100
- Dim length = 3
- Dim filema = "datama"
- TestMultiArray(filema, 100, 3)
- Dim fileja = "dataja"
- TestStringArray(fileja, 100, 3)
- End Sub
- Private Sub TestMultiArray(filename As String, size As Int32, length As Int32)
- 'Random MultiArray
- Dim rngarray = RngMultiArray(size, length)
- 'Speichern und Laden über Serialisierung
- SaveSourceSerialize(filename, rngarray)
- Dim newsrc = DirectCast(LoadSourceDeserialize(filename), String(,))
- 'Speichern und Laden über Streams
- SaveSource(filename, rngarray)
- Dim newsrc2 = LoadMultiArray(filename)
- End Sub
- Private Sub TestStringArray(filename As String, size As Int32, length As Int32)
- 'Random StringArray
- Dim rngarray = RngStringArray(size, length)
- 'Speichern und Laden über Serialisierung
- SaveSourceSerialize(filename, rngarray)
- Dim newsrc = DirectCast(LoadSourceDeserialize(filename), String())
- 'Speichern und Laden über Streams
- SaveSource(filename, rngarray)
- Dim newsrc2 = LoadStringArray(filename)
- End Sub
- Private Sub SaveSource(filename As String, source As String(,))
- Using fs = New FileStream(filename, FileMode.Create)
- Using sw = New StreamWriter(fs)
- Dim sb = New StringBuilder(source.GetLength(1))
- sw.WriteLine(source.GetLength(1))
- For i = 0 To source.GetLength(0) - 1
- For j = 0 To source.GetLength(1) - 1
- sb.Append(source(i, j))
- Next
- sw.WriteLine(sb.ToString)
- sb.Clear()
- Next
- End Using
- End Using
- End Sub
- Private Function LoadMultiArray(filename As String) As String(,)
- Using fs = New FileStream(filename, FileMode.Open)
- Using sr = New StreamReader(fs)
- Dim sb = New StringBuilder
- Dim nl = Environment.NewLine
- Dim length = Convert.ToInt32(sr.ReadLine)
- While Not sr.EndOfStream
- sb.AppendLine(sr.ReadLine)
- End While
- Dim split = sb.ToString.Split({nl}, StringSplitOptions.RemoveEmptyEntries)
- Dim result = New String(split.Length - 1, length - 1) {}
- For i = 0 To split.Length - 1
- For j = 0 To split(i).Length - 1
- result(i, j) = split(i)(j)
- Next
- Next
- Return result
- End Using
- End Using
- End Function
- Private Sub SaveSource(filename As String, source As String())
- Using fs = New FileStream(filename, FileMode.Create)
- Using sw = New StreamWriter(fs)
- For Each s In source
- sw.WriteLine(s)
- Next
- End Using
- End Using
- End Sub
- Private Function LoadStringArray(filename As String) As String()
- Using fs = New FileStream(filename, FileMode.Open)
- Using sr = New StreamReader(fs)
- Dim sb = New StringBuilder
- Dim nl = Environment.NewLine
- While Not sr.EndOfStream
- sb.AppendLine(sr.ReadLine)
- End While
- Return sb.ToString.Split({nl}, StringSplitOptions.RemoveEmptyEntries)
- End Using
- End Using
- End Function
- Private Sub SaveSourceSerialize(filename As String, source As Object)
- Using fs = New FileStream(filename, FileMode.Create)
- Try
- Dim formatter = New BinaryFormatter()
- formatter.Serialize(fs, source)
- Catch ex As Exception
- End Try
- End Using
- End Sub
- Private Function LoadSourceDeserialize(filename As String) As Object
- Using fs = New FileStream(filename, FileMode.Open)
- Try
- Dim formatter = New BinaryFormatter()
- Return formatter.Deserialize(fs)
- Catch ex As Exception
- End Try
- End Using
- Return Nothing
- End Function
- Private Function RngMultiArray(size As Int32, length As Int32) As String(,)
- Dim rngalpha = RngAlphaSource()
- Dim result = New String(size - 1, length - 1) {}
- For i = 0 To result.GetLength(0) - 1
- For j = 0 To result.GetLength(1) - 1
- result(i, j) = rngalpha(Rand.Next(rngalpha.Length))
- Next
- Next
- Return result
- End Function
- Private Function RngStringArray(size As Int32, length As Int32) As String()
- Dim sb As StringBuilder
- Dim rngalpha = RngAlphaSource()
- Dim result = New String(size - 1) {}
- For i = 0 To result.Length - 1
- sb = New StringBuilder(length)
- For j = 0 To length - 1
- sb.Append(rngalpha(Rand.Next(rngalpha.Length)))
- Next
- result(i) = sb.ToString
- Next
- Return result
- End Function
- Private Function RngAlphaSource() As String
- Return "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".
- OrderBy(Function(str) Rand.Next).ToArray
- End Function
- End Module
Natürlich gehts auch so
Spoiler anzeigen VB.NET-Quellcode
- Private Sub SaveSource2(filename As String, source As String(,))
- Using fs = New FileStream(filename, FileMode.Create)
- Using sw = New StreamWriter(fs)
- sw.WriteLine(source.GetLength(0))
- sw.WriteLine(source.GetLength(1))
- Dim sb = New StringBuilder(source.GetLength(1))
- For i = 0 To source.GetLength(0) - 1
- For j = 0 To source.GetLength(1) - 1
- sb.Append(source(i, j))
- Next
- sw.WriteLine(sb.ToString)
- sb.Clear()
- Next
- End Using
- End Using
- End Sub
- Private Function LoadMultiArray2(filename As String) As String(,)
- If Not File.Exists(filename) Then Return Nothing
- Using fs = New FileStream(filename, FileMode.Open)
- Using sr = New StreamReader(fs)
- Dim index = 0
- Dim size = Convert.ToInt32(sr.ReadLine)
- Dim length = Convert.ToInt32(sr.ReadLine)
- Dim result = New String(size - 1, length - 1) {}
- While Not sr.EndOfStream
- Dim line = sr.ReadLine
- For i = 0 To length - 1
- result(index, i) = line(i)
- Next
- index += 1
- End While
- Return result
- End Using
- End Using
- End Function
- Private Sub SaveSource2(filename As String, source As String())
- Using fs = New FileStream(filename, FileMode.Create)
- Using sw = New StreamWriter(fs)
- sw.WriteLine(source.Length)
- For Each s In source
- sw.WriteLine(s)
- Next
- End Using
- End Using
- End Sub
- Private Function LoadStringArray2(filename As String) As String()
- If Not File.Exists(filename) Then Return Nothing
- Using fs = New FileStream(filename, FileMode.Open)
- Using sr = New StreamReader(fs)
- Dim size = Convert.ToInt32(sr.ReadLine)
- Dim result = New String(size - 1) {}
- For i = 0 To result.Length - 1
- result(i) = sr.ReadLine
- Next
- Return result
- End Using
- End Using
- 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! -
-
Ähnliche Themen
-
Mehrdimensionales array sortieren
HaRoWagner - - Sonstige Problemstellungen
-
5 Benutzer haben hier geschrieben
- Elephant (4)
- RodFromGermany (2)
- Haudruferzappeltnoch (2)
- exc-jdbi (2)
- Bartosz (2)