Seite 2 von 2

Verfasst: 25.07.2006 23:42
von HoDam
Hallo Kiffi,

du warst schneller, aber ich komme zum gleichen Ergebnis.

Code: Alles auswählen

Searchchr$ = "."
Replacechr$ = ","
Offset.l = 51
SourceFile$ = "c:\source.csv"
TargetFile$ = "c:\target.csv"


Source = ReadFile(#PB_Any, SourceFile$)

If Source
  
  Target = CreateFile(#PB_Any, TargetFile$)
  
  If Target
    
    While Eof(Source)=0
      Zeile$ = ReadString(Source)
      ReplaceString(Zeile$, Searchchr$,Replacechr$, 2, Offset.l )  
      WriteStringN(Target, Zeile$) 
    Wend
    
    CloseFile(Target)
    
  Else
    ; Target.Csv konnte nicht erstellt werden
  EndIf 
  
  CloseFile(Source)
  
Else
  ; Source.Csv konnte nicht gelesen werden
EndIf
[/list]

Alle Variabeln lasse ich über ein ini-file einlesen und bin somit sehr flexibler beim suchen und ersetzen.

OK, beim ReplaceString habe ich Sonderfall, da ich den Modus 2 verwende, der sehr schnell ist, allerdings zur Bedingung hat das der zu ersetzende String die gleiche Länge haben muss. Ich hoffe, das ich diesen durch eine Überprüfung der Stringlänge von Searchchr$ und Replacechr$
von Fall zu Fall unterscheiden kann.

Ich habe noch eine weiter Frage , die ich aber in einem neuen Thema erstellt habe " Anzahl der Zeilen in einer Textdatei ermitteln"

Vielen Dank für die Ideen.

Verfasst: 31.07.2006 19:12
von HoDam
Soweit funktioniert alles.

Allerdings fällt mir auf, das ich keine proportionales Verhalten habe .


10000 Datensätze 2 sec
100000 Datensätze 5 sec
1000000 Datensatze 245sec.

Ich vermute , das kommt daher, da erst die komplette Datei eingelesen wird und dann die eigenltich Routine startet. Der Zeitfresser ist das lesen der kompletten Datei

Wie ist es möglich diese Datei sequentiell abzuarbeiten.
Problem dabei , das innerhalb einer Datei alle Datensätze die gleiche Länge haben, allerdings kann jede Datei für sich eine unterschiedliche Datensatzlänge haben.

Ok, es wäre keine Problem die Datensatzlänge auszulesen, aber leider erst nachdem die Datei komplett hochgeladen ist. Zumindest weiss ich es nicht besser.

Leider kenne ich mich mit Memorybelegung und Speicherblöcken nicht so gut aus. Wenn da jemand einen Link hätte


Danke

Verfasst: 31.07.2006 21:47
von Kaeru Gaman
wenn du mit ReadString() jeden datensatz einzeln liest, kannst du direkt die datensatzlänge ermitteln und dann die gesamtzahl datensätze abschätzen (über die dateilänge). dann kannst du satzweise lesen und umwandeln, und ebenso den balken anzeigen... ;)

Verfasst: 01.08.2006 00:35
von HoDam
mir geht es nicht um eine Fortschrittsanzeige.
Das habe ich bereits gelöst, indem ich die Zeilenanzahl des Datei ermittelt habe und diesen ins Verhältnis zu den abgearbeiteten Zeilen setze.

Mir wäre lieber ich könnte in etwa ein proportionales verhalten programmieren, so das ich weiss, wenn ich für 100000 datensätze 5 sec brauche, dann brauch ich eben für 1000000 50sec und so weiter. und Dieses lässt sich wahrscheinlich nur über sequentielles einlesen und wegschreiben lösen.

Verfasst: 01.08.2006 10:05
von Kaeru Gaman
deswegen meinte ich ja, lies jeden datensatz einzeln per readstring()