Statt pointer eine Stringvariable nutzen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
PIC18F2550
Beiträge: 104
Registriert: 29.04.2024 09:10
Computerausstattung: Server HP Proliant G7
PC AMD FX(tm)-9590, 64Gb Ram, 2x 2TB Raid5 SAS

Statt pointer eine Stringvariable nutzen

Beitrag von PIC18F2550 »

Hallo,
in der Hilfe habe ich nur das gefunden.

Code: Alles auswählen

bytes = ReadData(0, *MemoryID, length)   ; Einlesen aller Daten in den Speicherblock
Da ich aber später mit

Code: Alles auswählen

Position = FindString(String$, SuchString$ [, StartPosition [, Modus]])
arbeiten möchte,
Frage ich mich ob ein direkter import in eine Stringvariable möglich ist.

Die datei kann bis zu 150Mb groß werden.

Danke.
Barbarus hic ergo sum, quia non intellegor ulli.
Ein Barbar bin ich hier, da ich von keinem verstanden werde.
ʎɐqǝ ıǝq ɹnʇɐʇsɐʇ ǝuıǝ ɹǝpǝıʍ ǝıu ǝɟnɐʞ ɥɔı ´uuɐɯ ɥo
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Statt pointer eine Stringvariable nutzen

Beitrag von NicTheQuick »

Am sichersten ist, wenn du ReadString() mit dem Flag #PB_File_IgnoreEOL nutzt. Damit erhältst du einen String mit dem kompletten Dateiinhalt.
Allerdings darf die Datei keine ungültigen Zeichen wie zum Beispiel Nullbytes enthalten.

Je nachdem wie oft du diese Suchanfragen auf der selben Datei ausführen willst, gibt es aber effizientere Algorithmen um das zu bewerkstelligen. Diese sind allerdings komplexer zu programmieren.
Benutzeravatar
PIC18F2550
Beiträge: 104
Registriert: 29.04.2024 09:10
Computerausstattung: Server HP Proliant G7
PC AMD FX(tm)-9590, 64Gb Ram, 2x 2TB Raid5 SAS

Re: Statt pointer eine Stringvariable nutzen

Beitrag von PIC18F2550 »

OK.
Werde ich nächste Woche testen.

Es wird schon eine Menge werden aber die zeit ist erstmal nicht so wichtig.
Der Algorithmus zum Auswerten wird schon kompliziert genug.

Danke.
Barbarus hic ergo sum, quia non intellegor ulli.
Ein Barbar bin ich hier, da ich von keinem verstanden werde.
ʎɐqǝ ıǝq ɹnʇɐʇsɐʇ ǝuıǝ ɹǝpǝıʍ ǝıu ǝɟnɐʞ ɥɔı ´uuɐɯ ɥo
Benutzeravatar
PIC18F2550
Beiträge: 104
Registriert: 29.04.2024 09:10
Computerausstattung: Server HP Proliant G7
PC AMD FX(tm)-9590, 64Gb Ram, 2x 2TB Raid5 SAS

Re: Statt pointer eine Stringvariable nutzen

Beitrag von PIC18F2550 »

Hab es doch noch ausprobiert

Code: Alles auswählen

Debug ReadString(0, #PB_File_IgnoreEOL)
bricht nach 256.088 Bytes ab.

Liegt das eventuell an Debug?
Barbarus hic ergo sum, quia non intellegor ulli.
Ein Barbar bin ich hier, da ich von keinem verstanden werde.
ʎɐqǝ ıǝq ɹnʇɐʇsɐʇ ǝuıǝ ɹǝpǝıʍ ǝıu ǝɟnɐʞ ɥɔı ´uuɐɯ ɥo
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Statt pointer eine Stringvariable nutzen

Beitrag von Kiffi »

PIC18F2550 hat geschrieben: 10.05.2024 16:43 Hab es doch noch ausprobiert

Code: Alles auswählen

Debug ReadString(0, #PB_File_IgnoreEOL)
bricht nach 256.088 Bytes ab.

Liegt das eventuell an Debug?
Mach testweise mal lieber ein

Code: Alles auswählen

Debug Len(ReadString(0, #PB_File_IgnoreEOL))
Wenn der angezeigte Wert noch immer zu klein ist, kann durchaus ein Nullbyte vorhanden sein.
a²+b²=mc²
Benutzeravatar
H.Brill
Beiträge: 496
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

Re: Statt pointer eine Stringvariable nutzen

Beitrag von H.Brill »

Das liegt am Debug. Habs mal mit einer 30 KB Datei getestet.
Wenn ich die Datei drastisch verkleinere (halbiere) , klappt es wieder.

Der Debug ist ja auch dafür nicht gedacht, eher für so kleinere Sachen mal auszugeben.
Man muß das halt so sehen : Der Debug nutzt zur Ausgabe ja auch nur eine Listbox (zusammen gesetztes Control).
Und so eine Zeile in einer Listbox kann auch nicht ewig lang werden. Da setzt Windows schon mal Grenzen.
Genauso mit der Anzahl Einträge.

Wenn keine Nullbytes in deinen Daten sind, lies es doch als Memoryblock ein. Mit Lof() kannst du ja die Größe
der Datei herausfinden und das Memory entsprechend allocieren. Wenn du das als String haben willst, ziehst du ihn
mit PeekS() halt raus.

Code: Alles auswählen

If ReadFile(0, file$) 
      length = Lof(0)                            ; Länge der geöffneten Datei ermitteln
      *MemoryID = AllocateMemory(length)         ; Reservieren des benötigten Speichers
      If *MemoryID
        bytes = ReadData(0, *MemoryID, length)   ; Einlesen aller Daten in den Speicherblock
      EndIf
      CloseFile(0)
 EndIf

Position = FindString(PeekS(*MemoryID), SuchString$ [, StartPosition [, Modus]])
PB 6.10
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Statt pointer eine Stringvariable nutzen

Beitrag von NicTheQuick »

Man verbraucht halt mehr als den doppelten Speicher, wenn man die Datei erst in Memory einliest und dann noch mal PeekS verwendet. Außerdem muss man dann schauen welche Zeichenkodierung für den Text in der Datei genutzt wird und bei PeekS das entsprechende Flag nutzen. Denn per default versucht PeekS erstmal Unicode einzulesen.

Mich würde mal interessieren, was du überhaupt machen willst. Vielleicht kannst du ja mal etwas näher beschreiben, was dein eigentliches Ziel ist und vielleicht gibt es dafür eine elegantere Lösung.
Benutzeravatar
H.Brill
Beiträge: 496
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

Re: Statt pointer eine Stringvariable nutzen

Beitrag von H.Brill »

Vielleicht hat er ja auch eine gewisse Struktur in den Daten, die er einliest.
Dann kann man auch die ganzen Möglichkeiten, was das Ausfiltern betrifft,
ausschöpfen. Z. B. die regulären Ausdrücke sind ja auch sehr hilfreich.
Man denkt halt nicht immer an sie und macht sich manchmal unnötige
Arbeit. Ich, jedenfalls, habe sie lieben gelernt.

PIC18F2550 : poste doch mal hier einen oder auch mehrere Datenblöcke.
Dann können wir sehen, wie wir am besten vorgehen.
PB 6.10
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Statt pointer eine Stringvariable nutzen

Beitrag von mk-soft »

Wenn es sich um eine Textdatei handelt nicht alles in eine String Variable schreiben.
Das suchen und filtern dauert sonst zu lange.
Besser eine LinkedList verwenden und Zeile für Zeile einlesen.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
H.Brill
Beiträge: 496
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

Re: Statt pointer eine Stringvariable nutzen

Beitrag von H.Brill »

mk-soft hat geschrieben: 11.05.2024 17:47 Wenn es sich um eine Textdatei handelt nicht alles in eine String Variable schreiben.
Das suchen und filtern dauert sonst zu lange.
Besser eine LinkedList verwenden und Zeile für Zeile einlesen.
Bringt aber nur was, wenn zusammengehörende Daten in eine Zeile geschrieben
werden können oder Trenner, wie bei csv o.ä. vorhanden sind, die man vorher dann
mit StringField() behandlen kann. Ansonsten nutzt es ja nichts, wenn ein Teil der
zusammen gehörenden Daten z.b. in Zeile 1 ist und der Rest dann in Zeile 2.
Das wird dann eher schwieriger. So eine Datei von einer Hardware hatte ich vor
30 Jahren auch mal. Da hatte die HW immer 80 Zeichen in einer Zeile, der
Rest der Messung kam dann in die nächste Zeile. Da die HW aber immer eine
bestimmte Anfangssequenz schrieb, konnte man das austüfteln, daß man je
Messung eine Zeile schreiben konnte. Und damals hatte ich nur die GW-BASIC
Funktionen zur Verfügung. Wäre damals ein Klacks gewesen, wenn man schon
reguläre Ausdrücke oder Stringfiled() usw. gekannt hätte.

Deshalb auch mein Vorschlag, mal hier so eine Datenmenge zu posten.
Sonst gibt das hier nur eine Raterei, was die HW in die Datei schreibt
bzw. wie sie die Daten reinschreibt.
PB 6.10
Antworten