Eine Möglichkeit, um diese Dateistruktur zu lesen / schreiben?

  • C#
  • .NET 5–6

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Eine Möglichkeit, um diese Dateistruktur zu lesen / schreiben?

    Ich möchte eine Datei auslesen, die folgenden Inhalt hat:

    Spoiler anzeigen

    Quellcode

    1. Group PartnerData
    2. {
    3. Description "Partner mit Zugriffsrechten"
    4. Group Partner01
    5. {
    6. PartnerIndex 0
    7. PartnerName "Thomas Müller"
    8. PartnerAge 39
    9. PartnerAccess "FULL_ACCESS"
    10. Group ExtraInformation
    11. {
    12. GivenAccessBy "Max Mustermann"
    13. }
    14. }
    15. Group Partner02
    16. {
    17. PartnerIndex 1
    18. PartnerName "Franz Heineke"
    19. PartnerAge 42
    20. PartnerAccess "FULL_ACCESS"
    21. Group ExtraInformation
    22. {
    23. GivenAccessBy "Max Mustermann"
    24. Group ExtraInformation
    25. {
    26. GivenAccessBy "Lara Schmidt"
    27. }
    28. }
    29. }
    30. Group Partner03
    31. {
    32. PartnerIndex 2
    33. PartnerName "Lara Schmidt"
    34. PartnerAge 28
    35. PartnerAccess "FULL_ACCESS"
    36. }
    37. }
    38. Group LastUseData
    39. {
    40. Description "Datum, an dem Rechte zuletzt benutzt wurden"
    41. Group Entry01
    42. {
    43. ...
    44. }
    45. Group Entry02
    46. {
    47. ...
    48. }
    49. Group Entry03
    50. {
    51. ...
    52. }
    53. }
    54. Group ...
    55. {
    56. Description "..."
    57. Group Entry01
    58. {
    59. ...
    60. }
    61. Group Entry02
    62. {
    63. ...
    64. }
    65. Group Entry03
    66. {
    67. ...
    68. }
    69. }

    Und hier nochmal in einem Pastebin, falls die Einrückung falsch ist: pastebin.com/h5my0Lhf

    Ich habe nun leider überhaupt keine Ahnung, wie man dieses Format nennt und wonach ich in Google suchen könnte. Ich würde am liebsten eine Library nutzen, die sich mit diesem Format beschäftigt (falls es diese gibt). Ich habe zwar bereits eigene Ansätze gehabt, jedoch erscheinen mir diese als sehr ineffizient, weshalb ich eine bereits fertige Lösung bevorzugen würde. Meine Lösung war es, einen eigenen Parser zu schreiben, aber ich bin überhaupt nicht gut in sowas und blicke bei dem Code selbst nicht mehr durch. Es ist nie fertig geworden und ich habe den Code auch vor kurzem komplett verworfen. Dort bin ich durch jede Zeile gegangen, ich habe jedes mal abgefragt, ob es sich um eine Klammer handelt und und und.. Doch es war einfach zu verwirrend.

    Mein Ziel ist es, mit Code wie diesem hier, Gruppen zu erweitern:

    C#-Quellcode

    1. parsedFile.GetGroup("PartnerData").GetGroup("Partner01").AddGroup("Partner04", {"PartnerIndex" : 0, "PartnerName" : "Bianca", "PartnerAge" : 39, "PartnerAccess" : "FULL_ACCESS"}).AddGroup("ExtraInformations", {"GivenAccessBy" : "Franziska"}))


    Oder mit Code wie diesem hier, den Inhalt von Gruppen zu erhalten:

    C#-Quellcode

    1. GroupData groupData = parsedFile.GetGroup("Partner01")


    Ich habe wirklich überhaupt keine Ahnung, wie man das am schönsten und effizientesten angeht. Ich habe es mir ziemlich einfach vorgestellt und ich bin immer noch der Meinung, dass es einfach ist, aber ich kenne mich einfach zu wenig damit aus.

    Meine Fragen:
    - Gibt es einen Begriff für diese Dateistruktur? (z.B JSON, XML, usw.)
    - Gibt es für solche Fälle bereits eine Library, die ich nutzen könnte?
    - Wenn nicht, habt ihr Denkanstöße für jemanden, der sich nicht viel mit sowas beschäftigt?

    Bitte habt Gnade, ich habe unglaublich viele Stunden in eine gute Lösung investiert und würde mich hier kein weiteres mal blicken lassen, hätte ich nicht gründlich genug gesucht.

    Beispieldaten in Codeblock gesetzt ~EaranMaleasi

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „EaranMaleasi“ ()

    Ich kenne diese Dateistrucktur nicht, "fühlt" sich aber an wie ne Mischung aus XML und JSON, habe aber jetzt natürlich keine Standardlösung parat.
    Hier also wie ich die Sache angehen würde:

    Im Grunde sehe ich hier ein einziges Datenobjekt das man als Klasse abbilden kann:

    C#-Quellcode

    1. public class Group
    2. {
    3. public string Name { get; set; }
    4. public string Description { get; set; }
    5. public int PartnerIndex { get; set; }
    6. public string PartnerName { get; set; }
    7. public int PartnerAge { get; set;}
    8. public string PartnerAccess { get; set; } //könnte man evtl. auch als Enum anlegen
    9. public string GivenAccessBy { get; set; }
    10. public List<Group> SubGroups { get; } = new List<Group>();
    11. }


    Zuerst brauchst du ne List<Group> in der alle Top-Groups sitzen.
    Nun öffnet man nen FileStream setzt nen StreamReader drauf, und ließt via StreamReader.ReadLine() die Datei Zeile für Zeile aus.
    In der Schleife prüfst du dann immer wie die Zeile beginnt (Leerzeichen trimmen nicht vergessen), sei es Group oder { und legst dann entsprechend neue Groups an oder befüllst die momentan aktuelle Group entsprechend der Eigenschaften die du einließt.

    Am Ende hast du dann die gesamte Datei in einer List<Group> die du nach belieben erweitern oder bearbeiten kannst.
    @EaranMaleasi
    Vielen Dank für deine Antwort. Diesen Ansatz hatte ich ebenfalls schon. Ich bin durch alle Zeilen iteriert und wenn das Wort "Group" gefunden wurde, habe ich den Namen der Gruppe und kommende Variablen in einer Klasse für die Gruppe gespeichert. Wenn das der sauberste Weg ist (da ich mich damit nicht so gut auskenne, weiß ich es nicht), werde ich es wohl so schreiben. Ich habe jedoch vergessen, eine wichtige Information zu nennen: Die Variablen sind nicht immer vorhanden und es können mit der Zeit neue hinzukommen. Das heißt, dass in der Gruppe "ExtraInformations" auch in Zukunft Dinge wie: "WorkedHours" hinzukommen könnten. Gibt es da eine schöne Möglichkeit, dass dynamisch zu lösen? Ich dachte vielleicht an eine generische Dictionary. Würdest du das auch so angehen?

    Jetzt habe ich aber immer noch ein Problem mit dem hinzufügen von Gruppen an einer bestimmten Stelle. Wie könnte ich am saubersten und effizientesten das Ergebnis aus meinem ersten Post erreichen? Ist es überhaupt ratsam, mit ".AddGroup().AddGroup()" an die Sache heranzugehen oder wie wird das für gewöhnlich gelöst? Wie bereits im ersten Post beschrieben, würde ich gerne per Name der Gruppe die richtige Gruppe mit weiteren Gruppen erweitern können.
    Wenn ich mir die Datei so angucke, dann scheint mir, man könnte das Wort Group löschen, dann bestimmte Einträge (die meisten) quoten, und man hätte valides Json!
    Zu Json gibts fabelhafte NugetPakete, die alle Zugriffe, die du skizziert hast, abdecken.

    Also ich würde versuchen, einen Converter von und nach Json zu bauen.

    na, vielleicht auch nicht.
    Partner01, Partner02 - das sind ja eiglich baugleiche Objekte, das müsste man also in ein JArray konvertieren. Aber auch das kein unmöglich Ding.

    Also die Regelmässigkeit, die ich sehe: Alles, wo Group dransteht, müsste zu einem JObject konvertieren, und alles, was mit zwei Ziffern endet wäre ein JArray-Element.

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

    @ErfinderDesRades
    Über einen Konverter habe ich gar nicht nachgedacht, eine echt gute Idee. Dann könnte ich die bereits verfügbaren Funktionalitäten für JSON nutzen und müsste mir nicht zu viele Gedanken machen. Leider kenne ich mich zu wenig mit JSON aus, aber ich glaube, dass ich dennoch verstanden habe, wie du das gemeint hast. Ich habe mir auch gedacht, dass es echt ähnlich wie JSON aussieht. Ich werde mal ein wenig damit rumspielen, ich habe schon einige Ideen. Vielen Dank für den Denkanstoß.

    Ich lasse aber dennoch mal die Frage offen, ob es eine Möglichkeit gibt, dass auch anders zu machen (falls etwas besseres dabei herumkommt) oder ob jemand weiß, wie man diese Struktur nennt.
    vlt. hängste mal eine richtige datei an - mit diesem Dummy kann man wegen der vielen Auslassungen nicht gut experimentieren.
    bitte kein pastebin oder sonstigen Datenkraken - einfach Datei-Anhang-Funktion des Forums benutzen.

    Guck ich hab jetzt mal von Hand eine Umarbeitung vorgenommen:
    Spoiler anzeigen

    Quellcode

    1. Group PartnerData
    2. {
    3. Description "Partner mit Zugriffsrechten"
    4. Group Partner01
    5. {
    6. PartnerIndex 0
    7. PartnerName "Thomas Müller"
    8. PartnerAge 39
    9. PartnerAccess "FULL_ACCESS"
    10. Group ExtraInformation
    11. {
    12. GivenAccessBy "Max Mustermann"
    13. }
    14. }
    15. Group Partner02
    16. {
    17. PartnerIndex 1
    18. PartnerName "Franz Heineke"
    19. PartnerAge 42
    20. PartnerAccess "FULL_ACCESS"
    21. Group ExtraInformation
    22. {
    23. GivenAccessBy "Max Mustermann"
    24. Group ExtraInformation
    25. {
    26. GivenAccessBy "Lara Schmidt"
    27. }
    28. }
    29. }
    30. Group Partner03
    31. {
    32. PartnerIndex 2
    33. PartnerName "Lara Schmidt"
    34. PartnerAge 28
    35. PartnerAccess "FULL_ACCESS"
    36. }
    37. }
    38. Group LastUseData
    39. {
    40. Description "Datum, an dem Rechte zuletzt benutzt wurden"
    41. Group Entry01
    42. {
    43. PartnerIndex 0
    44. PartnerName "Thomas Müller"
    45. PartnerAge 39
    46. PartnerAccess "FULL_ACCESS"
    47. }
    48. Group Entry02
    49. {
    50. PartnerIndex 1
    51. PartnerName "Franz Heineke"
    52. PartnerAge 42
    53. PartnerAccess "FULL_ACCESS"
    54. }
    55. }

    Quellcode

    1. {
    2. "PartnerData": {
    3. "Description": "Partner mit Zugriffsrechten",
    4. "Partner":[
    5. {
    6. "PartnerIndex": 0,
    7. "PartnerName": "Thomas Müller",
    8. "PartnerAge": 39,
    9. "PartnerAccess": "FULL_ACCESS",
    10. "ExtraInformation": {
    11. "GivenAccessBy": "Max Mustermann"
    12. }
    13. },
    14. {
    15. "PartnerIndex": 1,
    16. "PartnerName": "Franz Heineke",
    17. "PartnerAge": 42,
    18. "PartnerAccess": "FULL_ACCESS",
    19. "ExtraInformation": {
    20. "GivenAccessBy": "Max Mustermann",
    21. "ExtraInformation": {
    22. "GivenAccessBy": "Lara Schmidt"
    23. }
    24. }
    25. },
    26. {
    27. "PartnerIndex": 2,
    28. "PartnerName": "Lara Schmidt",
    29. "PartnerAge": 28,
    30. "PartnerAccess": "FULL_ACCESS"
    31. }
    32. ]
    33. },
    34. "LastUseData": {
    35. "Description": "Datum, an dem Rechte zuletzt benutzt wurden",
    36. "Entry": [
    37. {
    38. "PartnerIndex": 0,
    39. "PartnerName": "Thomas Müller",
    40. "PartnerAge": 39,
    41. "PartnerAccess": "FULL_ACCESS"
    42. },
    43. {
    44. "PartnerIndex": 1,
    45. "PartnerName": "Franz Heineke",
    46. "PartnerAge": 42,
    47. "PartnerAccess": "FULL_ACCESS"
    48. }
    49. ]
    50. }
    51. }
    ich denk, sowas müsste sich auch automatisieren lassen.

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