Autor Beitrag
adi
Hält's aus hier
Beiträge: 5

WIN XP
D7 Ent
BeitragVerfasst: Do 29.04.04 09:27 
Guten Morgen,

ich habe dieses Forum durchforstet, aber keine Lösung gefunden. Darum die Frage:

ich möchte in einer .prt Datei (Unigraphics) [kann wie Text gehandhabt werden] Verweise ersetzen, dazu muss ich die Verweise suchen und ersetzen.
Im Inet habe ich bereits eine Lösung gefunden, sie funktioniert jedoch nur bei kleinen Dateien.

vgl:
www.swissdelphicente...showcode.php?id=1046

ich suche einen Code, der das gleiche macht, auch mit grossen (zB 10MB) Dateien.

Für Tips Trends und Antregungen danke ich im Voraus.

ich wünsche einen schönen Tag...

_________________
Gruss Adi
Semper fidelis
smiegel
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 992
Erhaltene Danke: 1

WIN 7
D7 Prof., C#, RAD XE Prof.
BeitragVerfasst: Do 29.04.04 10:25 
Hallo,

vielleicht hilft Dir das:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
procedure Ersetze(const FileName, suchen, ersetzen:String);  
var tin, tout:Textfile; 
    lese, temp:String
begin 
  temp:=ChangeFileExt(FileName, '.tmp');
  AssignFile(tin, FileName); 
  AssignFile(tout, temp); 
  Reset(tin); 
  Rewrite(tout); 
  while not Eof(tin) do 
  begin 
     ReadLn(tin, lese); 
     lese:=StringReplace(lese, suchen, ersetzen, [rfReplaceAll, rfIgnoreCase]); 
     WriteLn(tout, lese); 
  end// while 
  CloseFile(tout); 
  CloseFile(tin); 
  DeleteFile(FileName);
  RenameFile(temp, FileName);
end// Ersetze

_________________
Gruß Smiegel
Ich weiß, daß ich nichts weiß, aber ich weiß mehr als die, die nicht wissen, daß sie nichts wissen. (Sokrates)
adi Threadstarter
Hält's aus hier
Beiträge: 5

WIN XP
D7 Ent
BeitragVerfasst: Do 29.04.04 11:33 
Hi smiegel,

funktioniert ebenfalls nicht. Die zu ändernde Datei wird komplett zerstört, wahrscheinlich wird es nicht richtig eingelesen od so...
Manuell mit einem Hex-Editor funktionierts tip top, sobald aber Windowseditoren ins Spiel kommen klapts nicht mehr (edit usw.)

Das File muss geüffnet und bearbeitet werden, ohne eine weitere Ergänzung.

_________________
Gruss Adi
Semper fidelis
smiegel
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 992
Erhaltene Danke: 1

WIN 7
D7 Prof., C#, RAD XE Prof.
BeitragVerfasst: Do 29.04.04 14:17 
Hallo,

normalerweise funktioniert der Code für Textdateien einwandfrei.
Also kann die .prt-Datei nicht als (normale) Textdatei gehandhabt werden.

_________________
Gruß Smiegel
Ich weiß, daß ich nichts weiß, aber ich weiß mehr als die, die nicht wissen, daß sie nichts wissen. (Sokrates)
adi Threadstarter
Hält's aus hier
Beiträge: 5

WIN XP
D7 Ent
BeitragVerfasst: Fr 30.04.04 08:12 
Guten Morgen,

habe ich auch rausgefunden. Beim text klappt es immer einwandfrei. (sorry für die falsche Annahme)
Besteht die Möglichkeit, dass die Variable eine sehr lange Zeile nicht aufnehmen kann? Wieviel Zeichen passen in einen String? Wenn ich den Code ohne replace
laufen lasse, übernimmt er die ersten ca. 30 Zeichen und dann ist Schluss.

Ich müsste die Datei zeichenweise Auslesen, und nicht unbedingt als Text (es darf nicht konvertiert werden).

Trotzdem besten Dank für Deine Hilfe

_________________
Gruss Adi
Semper fidelis
smiegel
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 992
Erhaltene Danke: 1

WIN 7
D7 Prof., C#, RAD XE Prof.
BeitragVerfasst: Fr 30.04.04 08:17 
Hallo,

ein String kann theoretisch 2 GByte groß werden. Daran kann es also nicht liegen.
Ich vermute einmal, in der .prt-Datei sind ASCII-Codes kleiner 32 enthalten. Diese werden als Steuerzeichen interpretiert wie z.B. #8 oder #0 usw...

_________________
Gruß Smiegel
Ich weiß, daß ich nichts weiß, aber ich weiß mehr als die, die nicht wissen, daß sie nichts wissen. (Sokrates)
adi Threadstarter
Hält's aus hier
Beiträge: 5

WIN XP
D7 Ent
BeitragVerfasst: Fr 30.04.04 09:17 
Hallo,

danke für die Info. Ich habe die Datei auf den ftp geladen:

Dateiname: A-assembly-1.prt

ftp-link wurde gelöscht...

ich denke, das mit dem ASCII unter 32 ist das Problem.

Gibt es in Delphi eine Möglichkeit, eine Datei im Hex-Format zu editieren, sie muss alle Zeichen erfassen?
Habe Funktionen gefunden, die eine Konvertierung zulassen, komme mit ihnen aber auch nicht weiter.

_________________
Gruss Adi
Semper fidelis


Zuletzt bearbeitet von adi am Fr 07.05.04 10:25, insgesamt 1-mal bearbeitet
adi Threadstarter
Hält's aus hier
Beiträge: 5

WIN XP
D7 Ent
BeitragVerfasst: Fr 07.05.04 10:24 
Hallo,

ich habe mein Problem folgendermassen gelöst:

ausblenden volle Höhe Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
procedure Ersetze(const FileName, suchen, ersetzen:string);

var
  fin,fout : File of char;
  c1,c2,c3 : Char;
  n,i ,Position : Integer;
  temp: String;

begin
  i:=1;
  temp:=ChangeFileExt(FileName, '.tmp');

  AssignFile(fout,Filename);
  AssignFile(fin,temp);
  Reset(fout);
  Rewrite(fin);
  partchange.austauschparts.progress.Visible:=true;
  partchange.austauschparts.progress.Max := filesize(fout);
  try
    while Not Eof(fout) do begin
      Read(fout,c1);
      Position:=FilePos(fout);
//Abfrage Beginn
      n:=1;
      if (c1 = suchen[i]) then begin
        read(fout,c2);
        if (c2 = suchen[i+1]) then begin
          read(fout,c3);
          if (c3 = suchen[i+2]) then begin
            For n:= 1 to length(suchen) do begin
              write(fin,ersetzen[n]);
            end;
            Position:=Position+length(suchen);
            seek(fout,Position-1);
            read(fout,c1);
          end;
          seek(fout,Position);
        end;
        seek(fout,Position);
      end;
//Abfrage Ende

      write(fin,c1);
      partchange.austauschparts.progress.StepIt;
    end;
  finally
    CloseFile(fout);
    CloseFile(fin);
  end;
  partchange.austauschparts.progress.Visible:=false;
  partchange.austauschparts.change.Enabled:=false;

  DeleteFile(FileName);
  RenameFile(temp, FileName);
  
end;

_________________
Gruss Adi
Semper fidelis