Entwickler-Ecke
Dateizugriff - Grosse Datei splitten und Textdatei als input für die infos
hpburner - Sa 14.06.03 22:04
Titel: Grosse Datei splitten und Textdatei als input für die infos
Hallo
Ich möchte ein Programm schreiben dass eine textdatei einliest in diesem Format:
000000159744|000313856|advertise-75\startupa.img
das erste bis zu dem | ist das Offset (in dezimal) wo die datei die 'extrahiert' werden soll anfängt
das zweite ist die grösse in bytes(dezimal)
das 3te nach dem | schliesslich der dateiname
Also das programm oder vielmehr die prozedur soll die text datei auslesen und an das angegeben offset der grossen datei gehen dann soviel lesen wie die grösse ist das in eine Datei speichern die halt den dateinamen hat der als letztes angegeben ist. Ich hoffe ihr versteht was ich meine.
also mit readln kann ich ja alle zeilen in der textdatei auslesen, nur wie lese ich den ersten abschnitt aus und danach den 2ten und dann den 3ten ?!
mit blockread und blockwrite kann ich ja dann die datei auslesen und dann schreiben nur wie mache ich das genau ? Ich komm da echt nicht weiter :-/
wäre nett wenn ihr mir helfen würde :)
danke im Vorraus
dTrace - Mo 23.06.03 13:36
Titel: Re: Grosse Datei splitten und Textdatei als input für die in
| hpburner hat folgendes geschrieben: |
also mit readln kann ich ja alle zeilen in der textdatei auslesen, nur wie lese ich den ersten abschnitt aus und danach den 2ten und dann den 3ten ?!
mit blockread und blockwrite kann ich ja dann die datei auslesen und dann schreiben nur wie mache ich das genau ? Ich komm da echt nicht weiter :-/
|
HI :D
das eigentlich ganz einfach....
um den zweiten und dritten Teil deines Strings auszulesen, würde ich eine Suchroutine für den String schreiben. Du hast dein String in 3 Teile mit dem Zeichen "|" getrennt, ich würde dann nach diesem Zeichen suchen lassen!
Hier ein Beispielcode:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| function Suchen: String; var Str, Str2: String; I: Integer; begin Str := '000000159744|000313856|advertise-75\startupa.img' ; I := length(str);
for I := 1 to I-1 do begin if str[i] = '|' then begin break; end else str2 := str2 + str[i]; end; Result := str2; end; |
Mit diesem Code wird der String bis zum ersten "|" ausgelesen!
8) dTrace
Moderiert von
Tino: Code- durch Delphi-Tags ersetzt.
Tweafis - Mo 23.06.03 14:05
schau dir mal die methode explode an (unter FAQ) bie neue Einträge
hpburner - Mo 23.06.03 14:27
Danke habe es bereits per Explode gelöst und das programm geht nun jede zeile durch gibt die einzelnen werte in ein label aus bzw. epcihert sie in einen String:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| procedure TForm1.Button1Click(Sender: TObject); var x : Integer; MyExpl : TStringDynArray; S, FileName, offset, size : String;
begin for X := 0 to memo1.Lines.Count - 1 do begin S := memo1.Lines[x]; MyExpl := Explode('|', S); edit1.Text := MyExpl[0]; edit2.Text := MyExpl[1]; edit3.Text := MyExpl[2]; offset := MyExpl[0]; size := MyExpl[1]; FileName := MyExpl[2]; end;
end; |
Das Prog liest also am Anfang die Datei ein in ein Memo und teilt dann die einträge bis zu dem | halt zu.
Nun soll aber noch eine datei geöffnet werden und dort an das Offset gesprugen werden und so lange in eine neue datei geschrieben werden (FileName) bis die Grösse(Size) erreicht wurde.
Das geht ja alles mit Blockread/Write nur weiss ich noch nicht richtig wie genau.. :-/ :oops:
Die Edit Felder sind eine art progress wo steht welche datei gerade behandelt wird.
Moderiert von
Tino: Code- durch Delphi-Tags ersetzt.
dTrace - Mo 23.06.03 14:43
HI...also die Methode mit Explode ist natürlich viel viel einfacher.... :wink:
Um nun eine Datei zu füllen, solltest du dir mal in der Online Hilfe folgendes nachschlagen: TStream, Tmemorystream, Tfilestream...
Ich könnte dir jetzt den Code aufschreiben, aber versuche erst mal selber drauf zu kommen, wenn du wirklich nicht weiter weißt, dann melde dich noch mal :D
dTrace
hpburner - Mo 23.06.03 15:19
Das ist ja das Problem ;) das mit dem Explode hatte ich nen Tag nach dem Thread Start hier selber gelöst aber ich hänge immernoch an der Blockread/Write Sache fest und komme nicht wirklich weiter :-/
hpburner - Mo 23.06.03 19:02
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| procedure Split(FileName,SplitFileName : TFileName; SizeofFile : Integer); var i : Word; fs, sStream: TFileStream; SplitFileName: String; begin fs := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite); try begin sStream := TFileStream.Create(SplitFileName, fmCreate or fmShareExclusive); try if fs.Size - fs.Position < SizeofFile then SizeofFiles := fs.Size - fs.Position; sStream.CopyFrom(fs, SizeofFile); finally sStream.Free; end; end; finally fs.Free; end; end; |
Das ist ein Code der von Begin an die Datei einliest und dann die datei unter SplitFilename speichert und solange schreibt bis die Grösse erreicht wurde. Weiter komme ich leider niht weil ich keinen ahnung hab wie ich an ein bestimmtes offset gehe und von da an die datei 'absplitte' :oops:
Moderiert von
Tino: Code- durch Delphi-Tags ersetzt.
dTrace - Mo 23.06.03 19:28
Titel: Datei splitten
Also...
habe ich es richtig verstanden, du willst jetzt also sämtliche Dateien in eine schreiben ... oder? :?:
dTrace
hpburner - Di 24.06.03 16:56
nein genau anders rum. Alle datein aus einer grossen raus exrahieren (natürlich ohne kompression usw.) also einfach nur an offset XXX gehen dann solange schreiben bis die Size XXX erreicht wurde und das als neue datei abspeichern.
hpburner - Fr 27.06.03 14:03
kann mir denn keiner weiterhelfen ? :oops:
oetzgemoeh - Fr 27.06.03 14:26
x.
hpburner - Sa 28.06.03 18:50
Danke dir geht soweit :D
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!