Schnelleres zerlegen eines Strings

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Pelagio
Beiträge: 424
Registriert: 11.11.2004 17:52
Computerausstattung: AMD Ryzen 5 7600 6-Core Prozessor 3.80 GHz
16,0 GB Arbeitsspeicher
Windows 11 Pro Betriebssystem
Wohnort: Bremen

Schnelleres zerlegen eines Strings

Beitrag von Pelagio »

Hallo PB'ler

ich habe eine Datei von ca. 5 MB. Diese Datei will ich laden und in einzelne Felder zerlegen zBsp.:

Code: Alles auswählen

;Datei in FileData.s gelesen.
For n=1 to 35000
   NewElement(pValue())
    pValue() = StringField(FileData, n, #LF$)
    .....
Next n
Dies klappt auch hervorragend aber es dauert doch ein paar Minuten und dies liegt an StringField.
Meine Frage ist jetzt, gibt es eine schnellere Möglichkeit? :praise:
Ohne Zeit kein Fleiß
Auf neustem Stand zu sein ist eine Kunst die nicht jeder perfektioniert [Win11Pro; PB6.20 LTS]. :allright:
Benutzeravatar
DrShrek
Beiträge: 1970
Registriert: 08.09.2004 00:59

Re: Schnelleres zerlegen eines Strings

Beitrag von DrShrek »

Vieleicht gleich beim Einlesen (Zeilenweise) der Datei die Liste anlegen?
Siehste! Geht doch....?!
PB*, *4PB, PetriDish, Movie2Image, PictureManager, TrainYourBrain, ...
Benutzeravatar
Pelagio
Beiträge: 424
Registriert: 11.11.2004 17:52
Computerausstattung: AMD Ryzen 5 7600 6-Core Prozessor 3.80 GHz
16,0 GB Arbeitsspeicher
Windows 11 Pro Betriebssystem
Wohnort: Bremen

Re: Schnelleres zerlegen eines Strings

Beitrag von Pelagio »

Hallo DrShrek

Du hast zwar recht, es ist dann auch schneller aber die Datei wird von einem anderen Prozess gefüllt und damit muss ich die Zeit in der ich die Datei öffne so gering wie möglich halten.
Ohne Zeit kein Fleiß
Auf neustem Stand zu sein ist eine Kunst die nicht jeder perfektioniert [Win11Pro; PB6.20 LTS]. :allright:
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Schnelleres zerlegen eines Strings

Beitrag von ts-soft »

DrShrek hat geschrieben:Vieleicht gleich beim Einlesen (Zeilenweise) der Datei die Liste anlegen?
Das wird wohl länger dauern :wink:
Datei mit ReadData und dann mit Stringfield wird wohl das schnellste sein. Ich hab aber
mal irgendwo gelesen, das Stringfield immer von vorne anfängt, wenn das stimmt, wäre
eine eigene Routine dann doch geeigneter. Entsprechende Beispiele wie man so durch
den String oder Memory pointert gibt hier ja genug im Forum.

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Pelagio
Beiträge: 424
Registriert: 11.11.2004 17:52
Computerausstattung: AMD Ryzen 5 7600 6-Core Prozessor 3.80 GHz
16,0 GB Arbeitsspeicher
Windows 11 Pro Betriebssystem
Wohnort: Bremen

Re: Schnelleres zerlegen eines Strings

Beitrag von Pelagio »

Danke ts-soft,

Dank deiner Anregung habe ich mir ein Tool selber geschustert das tatsächlich weit schneller die Aufgabe erledigt.
Hier mein Ergebnis:

Code: Alles auswählen

Procedure.s SPCData_Field(vRam.i = #Null)
   Protected pValue.s
   Static pRam.i
   
   If vRam
      pRam = vRam
   Else
      While Not (PeekC(pRam)=#LF)
         pValue + Chr(PeekC(pRam))
         pRam + 1
      Wend
      pRam + 1
   EndIf
   ProcedureReturn pValue      
EndProcedure

; pRam = ReadData(.....)
pSize = CountString(pRam, #LF$)
SPCData_Field(@pRam)
For pRow=1 To pSize
   AddElement(SPCData())
   SPCData() = SPCData_Field()
Next pRow
:allright:
Ohne Zeit kein Fleiß
Auf neustem Stand zu sein ist eine Kunst die nicht jeder perfektioniert [Win11Pro; PB6.20 LTS]. :allright:
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Schnelleres zerlegen eines Strings

Beitrag von ts-soft »

Durch direktes lesen im Speicher, per Pointer, könntest Du Dir das PeekC sparen, was dann noch mal ne Menge
speed bringt. Wenn Du das nicht hinbekommst werde ich Dir Deine Routine mal umstricken, hab aber im Moment
recht wenig Zeit und denke das schaffst Du auch selbst :wink:

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
DrShrek
Beiträge: 1970
Registriert: 08.09.2004 00:59

Re: Schnelleres zerlegen eines Strings

Beitrag von DrShrek »

ts-soft hat geschrieben:Ich hab aber
mal irgendwo gelesen, das Stringfield immer von vorne anfängt, wenn das stimmt, wäre
eine eigene Routine dann doch geeigneter.
Startposition kann eingestellt werden:

Code: Alles auswählen

Position = FindString(String$, StringToFind$ [, StartPosition])
Siehste! Geht doch....?!
PB*, *4PB, PetriDish, Movie2Image, PictureManager, TrainYourBrain, ...
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Schnelleres zerlegen eines Strings

Beitrag von ts-soft »

DrShrek hat geschrieben:Startposition kann eingestellt werden:

Code: Alles auswählen

Position = FindString(String$, StringToFind$ [, StartPosition])
Ja, schön und Gut, aber was hat FindString mit StringField zu tun?
Aber wir sind alle mal etwas unkonzentriert, da kann das schon passieren.

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
DrShrek
Beiträge: 1970
Registriert: 08.09.2004 00:59

Re: Schnelleres zerlegen eines Strings

Beitrag von DrShrek »

ts-soft hat geschrieben:Aber wir sind alle mal etwas unkonzentriert, da kann das schon passieren.
:o Sorry ab 45 sollte Mann doch früher ins Bett gehen ;-)
Siehste! Geht doch....?!
PB*, *4PB, PetriDish, Movie2Image, PictureManager, TrainYourBrain, ...
Benutzeravatar
mk-soft
Beiträge: 3902
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Schnelleres zerlegen eines Strings

Beitrag von mk-soft »

Achtung!!!

Wenn die Datei von Purebasic erfolgreich geöffnet wurde kann das andere Programm die Datei nicht mehr öffnen.

Ist leider bei PB so

Siehe Link...
http://www.purebasic.fr/german/viewtopi ... =8&t=24955

P.S. Dann kann die Datei auch normal Zeile für Zeile eingelesen werden.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten