Txt-Daten in zwei Txt-Dateien ordnen und speichern

  • C#
  • .NET (FX) 4.5–4.8

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

    Txt-Daten in zwei Txt-Dateien ordnen und speichern

    Moin, ich habe eine Txt mit Artikeln und Preisen, die folgendermaßen formatiert ist:

    pommes|2,8|
    burger|7,8|
    cola|2,8|
    schnitzel|7|
    bier|3|
    sprite|2,8|
    currywurst|2,8|
    pizza|8,5|
    bratkartoffel|4,5|

    Nun Soll das Programm jeweils zwei Txt Dateien Speichern, die so aussehen:
    erste txt:
    pommes
    burger
    cola
    schnitzel
    bier
    sprite
    currywurst
    pizza
    bratkartoffel

    zweite txt:
    2,8
    7,8
    2,8
    7
    3
    2,8
    2,8
    8,5
    4,5

    Habe einen Artikeln mit Linq gefunden aber es war mir noch zu Komplex.
    docs.microsoft.com/de-de/dotne…iles-by-using-groups-linq

    Hätte Jemand Tipps bzw Vorschläge? Danke, LG
    Sowas hatten wir schon ein paarmal hier.

    Musste es bei mir nur kurz umändern.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. ​Option Strict On
    2. Option Explicit On
    3. Imports System.IO
    4. Imports System.Text
    5. Public Module TestVisual_Prog
    6. Public Sub Main()
    7. Dim scr = SourceText()
    8. Dim fi = SplitSource(scr)
    9. Dim destnames = "Names.txt"
    10. Dim destprices = "Prices.txt"
    11. SaveFoodInfos(fi, destnames, destprices)
    12. Dim fi2 = LoadFoodInfos(destnames, destprices)
    13. Debug.Assert(Equality(fi, fi2))
    14. End Sub
    15. Private Sub SaveFoodInfos(foodinfos() As FoodInfo, destfilenames As String, destfileprices As String)
    16. Dim names = New StringBuilder
    17. Dim prices = New StringBuilder
    18. For Each fi In foodinfos
    19. names.AppendLine(fi.Name)
    20. prices.AppendLine(fi.Price.ToString)
    21. Next
    22. File.WriteAllText(destfilenames, names.ToString)
    23. File.WriteAllText(destfileprices, prices.ToString)
    24. End Sub
    25. Private Function LoadFoodInfos(destfilenames As String, destfileprices As String) As FoodInfo()
    26. Dim crlf = Environment.NewLine
    27. Dim names = File.ReadAllText(destfilenames).Split({crlf}, StringSplitOptions.RemoveEmptyEntries)
    28. Dim prices = File.ReadAllText(destfileprices).Split({crlf}, StringSplitOptions.RemoveEmptyEntries)
    29. Dim result = New List(Of FoodInfo)
    30. If names.Length = prices.Length Then
    31. For i = 0 To names.Length - 1
    32. result.Add(New FoodInfo With {.Name = names(i), .Price = Convert.ToDecimal(prices(i))})
    33. Next
    34. End If
    35. Return result.ToArray
    36. End Function
    37. Private Function SplitSource(source() As String) As FoodInfo()
    38. Dim result = New List(Of FoodInfo)
    39. Array.ForEach(source, Sub(s) result.Add(SplitSource(s)))
    40. Return result.ToArray()
    41. End Function
    42. Private Function Equality(fi1() As FoodInfo, fi2() As FoodInfo) As Boolean
    43. If Not fi1.Length = fi2.Length Then Return False
    44. For i = 0 To fi1.Length - 1
    45. If Not fi1(i).Name = fi2(i).Name OrElse Not fi1(i).Price = fi2(i).Price Then
    46. Return False
    47. End If
    48. Next
    49. Return True
    50. End Function
    51. Private Function SplitSource(source As String) As FoodInfo
    52. Dim idx = source.IndexOf("|"c)
    53. Dim name = source.Take(idx).ToArray
    54. Dim sprice = String.Join(String.Empty, source.Skip(idx + 1).Take(source.Length - idx - 2).ToArray)
    55. sprice = sprice.Replace(","c, ".")
    56. Dim price = Convert.ToDecimal(sprice)
    57. Return New FoodInfo With {.Name = name, .Price = price}
    58. End Function
    59. Private Function SourceText() As String()
    60. Return New String() _
    61. {
    62. "pommes|2,8|",
    63. "burger|7,8|",
    64. "cola|2,8|",
    65. "schnitzel|7|",
    66. "bier|3|",
    67. "sprite|2,8|",
    68. "currywurst|2,8|",
    69. "pizza|8,5|",
    70. "bratkartoffel|4,5|"
    71. }
    72. End Function
    73. Private Class FoodInfo
    74. Public Name As String
    75. Public Price As Decimal
    76. End Class
    77. End Module


    Freundliche Grüsse

    exc-jdbi
    @Visual_Prog Du willst gepaarte Daten trennen? Was soll denn das?
    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!
    @exc-jdbi danke ich werde mich bei Rückfragen melden.

    @RodFromGermany Moin, ja das ganz soll eine Restaurant-Software werden.
    Die Ursprungs-txt entstammt einer DGV, bei der das Restaurant eine Übersicht aller Artikel und Preise hat.
    Auf einer anderen Registerkarte werden die laufenden Bestellungen eingetragen, und die Textboxen funktionieren mit Autocomplete. Dafür sind die neuen txts, um den Autocomplete als Quelle zu dienen.
    Mir ist zwar schon durch den Kopf gegangen, dass man bei der Speicherung der DGV einfach die txts fertig für den autocomplete erstellen könnte, aber trotzdem finde ich diesen "Datentrennungsvorgang" interessant.
    @Visual_Prog OK. Wenn Du diese Software ernsthaft erstellen willst, solltest Du mit einem sorgfältig erstellten Pflichtenheft anfangen, sonst rennst Du vom hundertsten ins tausendste und kommst nicht vorwärts.
    Mach Dir in diesem Zusammenhang eine Liste mit Features für die nächste Version, die Du dann auch tatsächlich erst in der nächsten Version angehst.
    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!
    Ein Consolen-Testprogramm

    VB.NET-Quellcode

    1. Option Strict On
    2. Option Explicit On
    3. Imports System.IO
    4. Module Module1
    5. Sub Main()
    6. Dim Pfad As String = "d:\#0\"
    7. Dim Org$ = "org.txt", Neu1$ = "neu1.txt", Neu2$ = "neu2.txt"
    8. Dim t$ = ""
    9. Dim fs As New FileStream(Pfad & Org, FileMode.Open)
    10. Dim sr As New StreamReader(fs)
    11. Dim fs1 As New FileStream(Pfad & Neu1, FileMode.Create)
    12. Dim sw1 As New StreamWriter(fs1)
    13. Dim fs2 As New FileStream(Pfad & Neu2, FileMode.Create)
    14. Dim sw2 As New StreamWriter(fs2)
    15. Do Until sr.Peek() = -1
    16. t = sr.ReadLine()
    17. sw1.WriteLine(t.Split("|"c)(0))
    18. sw2.WriteLine(t.Split("|"c)(1))
    19. Loop
    20. sr.Close()
    21. sw1.Close()
    22. sw2.Close()
    23. End Sub
    24. End Module
    Danke euch!
    Ich habe mal eine ganz andere Frage, ich habe eine Klasse vorliegen mit zb. einer Eigenschaft Preis(in double) und einer Eigenschaft Bestellname (in String).
    Von dieser Klasse habe ich eine Liste vorliegen.
    Nun möchte ich die Werte, die als Double gespeichert sind aufsummieren um den Gesamtpreis zu errechnen.

    Mein Versuch:

    _gesamtpreis = _listeBestellungen.sum().
    --> Die Sum Methode weiß natürlich nicht, dass sie nur die Double Werte berücksichtigen muss. Wie könnte ich das hinkriegen? Danke Gruß
    @Visual_Prog Zu deiner letzten Frage mit den Klassen hier mein Ansatz. 'Leider' in C# aber nicht verzagen müsste in vb sehr ähnlich sein.

    Die Zeile nach der Du fragst ist:

    C#-Quellcode

    1. foreach (var essen in AnstattTxtDatei.ListeAllerMenueEintraege)
    2. Sum += essen.Preis;




    Spoiler anzeigen

    C#-Quellcode

    1. using System;
    2. using System.Collections.Generic;
    3. namespace CS_VBP_Pommes
    4. {
    5. class Program
    6. {
    7. public static double Sum = 0;
    8. static void Main(string[] args)
    9. {
    10. Console.WriteLine($"Menue Gesammtpreis:\n");
    11. foreach (var essen in AnstattTxtDatei.ListeAllerMenueEintraege)
    12. {
    13. Sum += essen.Preis;
    14. Console.WriteLine($"+ {essen.Bestellname} für {essen.Preis}:\t {Sum} Euro\n");
    15. }
    16. Console.WriteLine($"------------\nGesammt {Sum} Euro");
    17. Console.ReadLine();
    18. }
    19. }
    20. public class MenueEintrag
    21. {
    22. public string Bestellname { get; set; }
    23. public double Preis { get; set; }
    24. public MenueEintrag(string bestellname, double preis)
    25. {
    26. Bestellname = bestellname;
    27. Preis = preis;
    28. }
    29. }
    30. public static class AnstattTxtDatei
    31. {
    32. public static readonly List<MenueEintrag> ListeAllerMenueEintraege = new()
    33. {
    34. new MenueEintrag("Pommes", 2.5),
    35. new MenueEintrag("Hamburger", 6),
    36. new MenueEintrag("Cheeseburger", 6.8),
    37. new MenueEintrag("Currywurst", 4.3),
    38. new MenueEintrag("Cola", 1.7)
    39. };
    40. }
    41. }
    Bilder
    • vb.jpg

      26,43 kB, 426×238, 38 mal angesehen
    codewars.com Rank: 4 kyu
    LINQ ist das Stichwort.

    C#-Quellcode

    1. var Sum = _listeBestellungen.Sum(x => x.Preis);
    Glaub ich. In VB auf jeden Fall

    VB.NET-Quellcode

    1. Dim Sum = _listeBestellungen.Sum(Function(x) x.Preis)

    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.