Seite 1 von 2
Wie speicher ich eine komplexere Struktur?
Verfasst: 06.07.2020 23:51
von Jac de Lad
Hallo,
vielleicht kann mir jemand einen Schubs in die richtige Richtung geben:
Ich hab eine Struktur, z.B:
Code: Alles auswählen
Structure
Dummy.f
NocheinDummy.s
Liste.s()
EndStructure
dann
usw...
Jetzt will ich alle Elemente von meineliste in einer Datei ablegen (oder von mir aus jedes in einer eigenen Datei, wie auch immer), wie kann ich das effizient tun, also ohne jeden String einzeln auszulesen? Kann ich die Größe des einzelnen Elements von meineliste ermitteln und es dann irgendwie als Gesamtheit weiterverarbeiten?
Re: Wie speicher ich eine komplexere Struktur?
Verfasst: 07.07.2020 00:33
von mk-soft
Re: Wie speicher ich eine komplexere Struktur?
Verfasst: 07.07.2020 05:40
von Bisonte
JSON funktioniert auch ... und sieht nicht so gewaltig abschreckend dabei aus
InsertJSONList()
ExtractJSONList()
sind für Listen allein. Wenn es um komplexere Dinge geht : Insert/ExtractJSONStructure....
so für die PB-Hilfe (F1) als Recherche-Tip

Re: Wie speicher ich eine komplexere Struktur?
Verfasst: 07.07.2020 09:39
von Jac de Lad
Vielen Dank, ich schaue mir das alles an und melde mich sobald ich in meinen Tränen ertrinke.
Nachtrag: Puh, OK, JSON geht da natürlich, aber da muss ich ja trotzdem alle Einträge einzeln bearbeiten. Ich suche nach einer Möglichkeit das in einem Rutsch zu erledigen, ähnlich wie die Struktur für ein Windows API, die auch als gesamtes gespeichert werden könnte (abzüglich der Strings, die nur als Adressen vorliegen).
Weiterer Nachtrag: Ich hätte erstmal richtig lesen müssen, mit insertjsonlist kommt man eigentlich schon bequem ganz weit.
Re: Wie speicher ich eine komplexere Struktur?
Verfasst: 07.07.2020 15:03
von Olafmagne
Hallo
Das ganze in einem Beispiel
Code: Alles auswählen
;Creation des Liste und JSON
NewList Names.s()
AddElement(Names()): Names() = "John"
AddElement(Names()): Names() = "Jane"
AddElement(Names()): Names() = "Jim"
If CreateJSON(0)
InsertJSONList(JSONValue(0), Names())
Debug ComposeJSON(0,#PB_JSON_PrettyPrint)
EndIf
FreeList(Names())
;Kann jetzt gespeichert werden
;
;(Json laden )-nicht im Code
;Neue Liste und extrakt. von JSON
NewList coord.s()
ExtractJSONList(JSONValue(0), coord())
ForEach coord()
Debug "Name="+coord()
Next
Olaf
Re: Wie speicher ich eine komplexere Struktur?
Verfasst: 07.07.2020 15:18
von Kiffi
ergänzend für jacdelad noch folgende Befehle:
LoadJSON() und
SaveJSON()
Re: Wie speicher ich eine komplexere Struktur?
Verfasst: 07.07.2020 16:38
von Jac de Lad
Ja, ja, das ist klasse. So klappt das auch mit meiner Map. 2 Fragen sind aber aufgekommen: wie übernehme ich z.B. alle Werte von MeineMap("eins"), ohne gleich die gesamte map zu übernehmen? Und wofür genau ist JSONValue() da? Die Hilfe hilft mir da irgendwie nicht wirklich.
Re: Wie speicher ich eine komplexere Struktur?
Verfasst: 07.07.2020 16:51
von Olafmagne
JSONValue() ist der DatenType,
d.h.,diese Function gibt den DatenType des JSON-Eintrag's zurück
Olaf
Re: Wie speicher ich eine komplexere Struktur?
Verfasst: 07.07.2020 21:16
von Jac de Lad
Aber wie hängt das mit InsertJSONList() zusammen? Ich erkenne den Sinn an der Stelle nicht.
Re: Wie speicher ich eine komplexere Struktur?
Verfasst: 08.07.2020 00:04
von mk-soft
Das Einzige was du braucht ist InsertJSONStructure(...) und ExtractJSONStructure(...).
Also genau so wie bei meinen Link nur mit XML. Siehe LoadProjectData(...) und SaveProjectData(...)
Mehr braucht man nicht, da Listen oder Arrays in Strukturen mit übernommen werden.
Auszug
Code: Alles auswählen
Structure udtProjectData
Version.i
Date.s
; Data
;TODO Any Data
List Text.s()
EndStructure
Global ProjectData.udtProjectData
; ----
Procedure LoadProjectData(FileName.s, *ProjectData.udtProjectData)
Protected xml
If FileSize(FileName) > 0
xml = LoadXML(#PB_Any, FileName)
If xml And XMLStatus(xml) = #PB_XML_Success
ExtractXMLStructure(MainXMLNode(xml), *ProjectData, udtProjectData, #PB_XML_NoCase)
FreeXML(xml)
ProcedureReturn #True
EndIf
EndIf
ProcedureReturn #False
EndProcedure
; ----
Procedure SaveProjectData(FileName.s, *ProjectData.udtProjectData)
Protected r1, xml
xml = CreateXML(#PB_Any)
If xml
*ProjectData\Version = 101
*ProjectData\Date = FormatDate("%YYYY-%MM-%DD %HH.%II.%SS", Date())
If InsertXMLStructure(RootXMLNode(xml), *ProjectData, udtProjectData)
FormatXML(xml, #PB_XML_ReFormat)
If SaveXML(xml, FileName)
r1 = #True
Else
r1 = #False
EndIf
EndIf
FreeXML(xml)
EndIf
ProcedureReturn r1
EndProcedure