List OF String speichern in Datei

  • VB.NET
  • .NET 5–6

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von Mabbi.

    List OF String speichern in Datei

    Hi,

    ich habe gerade irgendwie ein Brett vor dem Kopf oder peil es einfach nicht.

    Hier im Forum gibt es eine Lösung zu List of String speichern..... vb-paradise.de/index.php/Threa…String-als-txt-speichern/
    Das funktioniert auch einwandfrei.

    Ich habe nun dieses Konstrukt:

    VB.NET-Quellcode

    1. ...
    2. Public _Adressdaten As New List(Of Adresse)
    3. ...
    4. Public Class Adresse
    5. Public Property Kundennummer As Double
    6. Public Property Telefonnummer As String
    7. Public Property Str_HausNr As String
    8. Public Property Fkzeichen As String
    9. Public Property Plz_Ort As String
    10. Public Property Plz As String
    11. Public Property Ort As String
    12. Public Property Konditionen As String
    13. Public Property VK As String
    14. Public Property Email As String
    15. Public Property Sperre As String
    16. Public Property Name1 As String
    17. Public Property Name2 As String
    18. Public Property ZAZ As String
    19. Public Property MWST As String
    20. End Class


    Die _Adressdatecn nutz ich als Liste für Autofill-Vvorschläge in einer Combo-Box.
    Wenn ich probiere die _Adressdaten zu speichern (aktuell bereite ich die bei jedem Programmstart auf, das will ich nur noch bei Bedarf machen(Änderungen) und sonst aus einem FIle Laden)

    VB.NET-Quellcode

    1. Public Sub ComboBoxListe_AdressenDB()
    2. 'WW-Rohadaten ladenund in die _Adressdaten schaufeln
    3. Dim AlleZeilen As New List(Of String())
    4. Call Rohdaten_DB_laden(AlleZeilen, DP_Adressen_Rohdaten)
    5. Call LadeAdressDaten(AlleZeilen)
    6. AlleZeilen.Clear()
    7. AlleZeilen = Nothing
    8. '_Adressdaten verarbeiten
    9. For i As Integer = 0 To _Adressdaten.Count - 1
    10. If _Adressdaten(i).Kundennummer > 0 Then
    11. Treffer.Add("###ADRNr:" & _Adressdaten(i).Kundennummer.ToString.Trim & "###Name1:" & _Adressdaten(i).Name1.Trim & "###Name2:" & _Adressdaten(i).Name2.Trim & "###")
    12. End If
    13. Next
    14. 'Absturz ??
    15. System.IO.File.WriteAllLines("C:\Users\#######\Desktop\Test.txt", _Adressdaten.ToArray())
    16. End Sub


    Der Fehler lautet:

    Das Objekt des Typs "Adresse[]" kann nicht in Typ "System.Collections.Generic.IEnumerable`1[System.String]" umgewandelt werden.

    Was mache ich falsch ?
    Vielen Dank für Eure Hilfe.
    Speichere den Kram als JSON, ist wesentlich angenehmer und du sparst dir das ganze gebastel mit Strings.

    Müsste in etwas so gehen:

    C#-Quellcode

    1. string jsonString = JsonSerializer.Serialize<List<Adressdaten>>(adressDaten);
    2. List<Adressdaten> adressDaten = JsonSerializer.Deserialize<List<Adressdaten>>(jsonString);
    Steht doch da. Eine Ansammlung von Adresse-Objektinstanzen sind nun mal keine Ansammlung von Strings.

    Du musst Dir da in solch einem Fall schon selber was basteln, indem Du die einzelnen Adresse-Bestandteile zu Strings zusammenfügst und diese Strings dann in die Datei schreibst. Das wäre eine einfache (leider fehleranfällige!) Methode zum Thema Serialisierung.
    Also: Jede Adresse durchgehen, die Bestandteile in Strings verwandeln, diese Gruppe von Strings zu einem String zusammenfassen und das alles für jede Adresse. Und am Ende die Stringrepräsentationen der Adressen in eine Datei speichern.

    VB.NET-Quellcode

    1. Dim AddressesAsText As New List(Of String)
    2. For Each Adress In _Adressdaten
    3. AddressesAsText.Add(String.Join(";"c, Adress.Kundennummer.ToString, Adress.Telefonnummer, Adress.Str_HausNr 'usw.)
    4. Next

    Warum ist das Ganze fehleranfällig? Bei dem String.Join musst Du ein Zeichen angeben, welches als Trennzeichen zwischen den einzelnen Adress-Bestandteilen herhält, hier beispielweise mit ; angegeben. Wenn dieses Zeilen aber in den Daten vorkommen sollte, also z.B. Sperre = "tl;dr", dann wird es bei der Wiederherstellung der Daten (Deserialisierung) Probleme geben, weil dann mehr ; da sind als erwartet. Auch sind Zeilenumbrüche in Deinen Daten ein Problem, weil man normalerweise einen Zeilenumbruch als Ende des alten/Anfang des neuen Datensatzes sieht. Auch musst Du Dich damit beschäftigen, wie Du diese String-Daten wieder in Deine ursprünglichen Datentypen umwandelst.
    "Gute Serialisierung" macht man mit entsprechend vorbeireiteten Hilfsklassen. XmlSerializer, BinarySerializer etc. Aber ich gebe @slice vollkommen recht: Die Verwendung des JSON-Serializers seh auch ich immer noch am komfortabelsten, deshalb benutz ich den schon seit langer Zeit in meinen Programmen.

    ##########

    @Mabbi
    Ach Moment. Oder wolltest Du statt den Adressen die Treffer speichern? Weil: Du gibst ja was anderes an: System.IO.File.WriteAllLines([…] _Adressdaten.ToArray())
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

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

    @slice & @vaporized.
    Danke für Eure Antworten, ich habe die json Variante ausprobiert, funktioniert gut. Habe es nun aber im aktuellen Anwedungsfall nicht eingebaut.

    Am Ende habe ich mich gegen den json entschieden und die Listenerstellung einfach in einen Backgroundworker verbannt, die 4 Sekunden die alle ca. brauchen blockieren die Oberfläche nicht mehr und da wo die gebraucht werden habe ich eine Abfrage drin, ob der Worker schon fertig ist.



    @Mabbi
    Ach Moment. Oder wolltest Du statt den Adressen die Treffer speichern?


    Ja, ich habe es falsch in meinem ersten Quelltext dringehabt, die Treffer-Liste ist die wichtige.
    Gut erkannt :)
    Leider gibt es gut 20 Stück von denen für diverse Comboboxen. Und da ich die immer aktuell halten will ist es die Variante mit dem BGW geworden.
    Mein erster BGW btw, hab mich elendig lange durch die MS-Documentation gehangelt und die Fehler drin (die haben VBA - stuff drin und ich habe bei mir ja alles rausgeworfen ohne VBA/alten VB Code und mit Strict on war das für mich schon kniffelig)selber gefixed. Bin ein klein bissel stolz...lol.


    Vielen Dank für Eure Hilfe.

    Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von „Mabbi“ ()