Autor Beitrag
hpburner
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: Sa 14.06.03 22:04 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 31


Delphi 5 Enterprise
BeitragVerfasst: 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:
ausblenden 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);

 //nach dem ersten "|" suchen
 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 user profile iconTino: Code- durch Delphi-Tags ersetzt.

_________________
Wenn du aufsteigen willst, dann solltest du es mit dem Wind tun.
Tweafis
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 647

WinXP + fbsd
Delphi 5 Prof
BeitragVerfasst: Mo 23.06.03 14:05 
schau dir mal die methode explode an (unter FAQ) bie neue Einträge

_________________
.: Es wird der Tag kommen, an dem wir es nicht mehr ändern können :.
hpburner Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: 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:
ausblenden 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 user profile iconTino: Code- durch Delphi-Tags ersetzt.
dTrace
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 31


Delphi 5 Enterprise
BeitragVerfasst: 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

_________________
Wenn du aufsteigen willst, dann solltest du es mit dem Wind tun.
hpburner Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: Mo 23.06.03 19:02 
ausblenden 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 user profile iconTino: Code- durch Delphi-Tags ersetzt.
dTrace
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 31


Delphi 5 Enterprise
BeitragVerfasst: 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

_________________
Wenn du aufsteigen willst, dann solltest du es mit dem Wind tun.
hpburner Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: Fr 27.06.03 14:03 
kann mir denn keiner weiterhelfen ? :oops:
oetzgemoeh
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 28



BeitragVerfasst: Fr 27.06.03 14:26 
x.


Zuletzt bearbeitet von oetzgemoeh am Sa 24.04.10 23:57, insgesamt 1-mal bearbeitet
hpburner Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: Sa 28.06.03 18:50 
Danke dir geht soweit :D