Seite 1 von 3

Statt pointer eine Stringvariable nutzen

Verfasst: 10.05.2024 15:48
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.

Re: Statt pointer eine Stringvariable nutzen

Verfasst: 10.05.2024 16:03
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.

Re: Statt pointer eine Stringvariable nutzen

Verfasst: 10.05.2024 16:08
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.

Re: Statt pointer eine Stringvariable nutzen

Verfasst: 10.05.2024 16:43
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?

Re: Statt pointer eine Stringvariable nutzen

Verfasst: 10.05.2024 16:45
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.

Re: Statt pointer eine Stringvariable nutzen

Verfasst: 10.05.2024 17:45
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]])

Re: Statt pointer eine Stringvariable nutzen

Verfasst: 11.05.2024 11:22
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.

Re: Statt pointer eine Stringvariable nutzen

Verfasst: 11.05.2024 12:45
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.

Re: Statt pointer eine Stringvariable nutzen

Verfasst: 11.05.2024 17:47
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.

Re: Statt pointer eine Stringvariable nutzen

Verfasst: 11.05.2024 19:15
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.