Avatar billede anold Nybegynder
03. juni 2002 - 07:34 Der er 23 kommentarer og
1 løsning

udskift dele af en tekstfil

jeg har en masse tekstfiler i et dir som jeg gerne vil gennemsøge og rette en bestemt del af.
alle de tekstfiler der skal rettes ser sådan ud :

op = 4
[
    coolant = "4"
    cutfin = "0"
    descrip = "Copy Milling"
    feedupr = "1200", "upm"
    feedupr3 = "200", "upm"
    intol = "0.005"
    outol = "0.005"
    section = "1030107"
    speedcss = "12000", "rpm"
    stepover = "0.05"
    user_name = "Copy Milling.4"
]

op = 5
[
    coolant = "4"
    cutfin = "0"
    descrip = "Copy Milling"
    feedupr = "40", "upm"
    feedupr3 = "20", "upm"
    intol = "0.005"
    outol = "0.005"
    section = "1030107"
    speedcss = "12000", "rpm"
    stepover = "0.06"
    user_name = "Copy Milling.5"
]

op = 6
[
    coolant = "1"
    cutfin = "0.5"
    descrip = "Copy Milling"
    feedupr = "1200", "upm"
    feedupr3 = "200", "upm"
    intol = ".025"
    outol = ".025"
    section = "1030107"
    speedcss = "7500", "rpm"
    stepover = "3"
    user_name = "Copy Milling.6"
]


Det er så det der står mellem [] efter OP = 5
jeg gerne vil bytte ud med :

    coolant = "4"
    cutfin = "0"
    descrip = "Copy Milling"
    feedupr = "40", "upm"
    feedupr3 = "20", "upm"
    intol = "0.005"
    outol = "0.005"
    section = "1030107"
    speedcss = "12000", "rpm"
    stepover = "0.06"
    user_name = "Copy Milling.5"
]

hvordan gør jeg det ?
Avatar billede hreiff Nybegynder
03. juni 2002 - 08:19 #1
procedure TForm1.Kopi(Sender: TObject);
var
  FromFile, ToFile: textfile;
  s: string;
begin
  if opendialog1.execute then
  begin
    AssignFile(FromFile, 'opendialog1.filename);
    Reset(FromFile);
    if saveDialog1.execute then
    begin
      AssignFile(ToFile,SaveDialog1.Filename);
      Rewrite(ToFile);
      while not Eof(FromFile) do
      begin
        readln(FromFile,s);
        if s= 'OP = 5' then
        begin
          for i := 1 to 13 do
            readln;    {læser linjerne mellem [] uden at skrive}
        Wrileln(Tofile,'[');
        Writeln(Tofile,'  coolant = "1"');

        osv.

        Writeln(Tofile,']');
        end;
        WriteLn(ToFile,s);
      end;
      CloseFile(ToFile);
    end;
    CloseFile(FromFile);
  end;
end;

tilsidst laver du en deletefile på det gamle navn
og en renamefile fra det nye til det gamle

//hreiff
Avatar billede hreiff Nybegynder
03. juni 2002 - 08:35 #2
Hvis du vil rette samtlige filer, så kig lidt på det her:

procedure TForm1.Button1Click(Sender: TObject);
var
s : TSearchRec;
begin
  if FindFirst('c:\*.*', faAnyFile, s) = 0 then
    begin
      repeat
        if s.Attr <> faDirectory then
        begin
          Kopi(s.Name,'xxxx.tmp');
          Erase(s.Name);
          Rename('xxxx.temp',s.Name);
        end;
      until FindNext(s) <> 0;
  end;
end;
Avatar billede borrisholt Novice
03. juni 2002 - 16:25 #3
En efter min smag meget besværlig oh langsom løsning ... Brug en TStringList i stedet den er MEGET hurtigere !

Jens B
Avatar billede hreiff Nybegynder
04. juni 2002 - 10:16 #4
Det var faktisk en god idé:

procedure TForm1.Button1Click(Sender: TObject);
var
  MyList: TStringList;
  indx,i: integer;
  s: string;
begin
  s:= 'op = 5';
  MyList := TStringList.create;
  MyList.LoadFromFile('E:\mill.txt');

  Indx := -1;
  for i := 0 to MyList.Count-1 do
    if s = MyList.strings[i] then Indx := i;

{  If MyList.Find(s, indx) then        }
{  burde bruges, men af en eller anden grund }
{  virker det ikke hos mig }

  If (Indx <> -1) then
  begin
    showmessage('"'+s+'"'+' har nr '+IntToStr(Indx));
    showmessage(MyList.strings[Indx]);

    for i := 2 to 12 do
      Mylist.delete(Indx+i);

    MyList.insert(Indx+2, '    coolant = "4"');
    MyList.insert(Indx+3, '    cutfin = "0"');
    MyList.insert(Indx+4, '    descrip = "Copy Milling"');
    MyList.insert(Indx+5, '    feedupr = "40", "upm"');
    MyList.insert(Indx+6, '    feedupr3 = "20", "upm"');
    MyList.insert(Indx+7, '    intol = "0.005"');
    MyList.insert(Indx+8, '    outol = "0.005"');
    MyList.insert(Indx+9, '    section = "1030107"');
    MyList.insert(Indx+10,'    speedcss = "12000", "rpm"');
    MyList.insert(Indx+11,'    stepover = "0.06"');
    MyList.insert(Indx+12,'    user_name = "Copy Milling.5"');

    MyList.SaveToFile('E:\mill.txt');

  end
  else
    showmessage('"'+s+'"'+' blev ikke fundet');
  MyList.Free;
end;
Avatar billede anold Nybegynder
04. juni 2002 - 10:21 #5
uha nu bliver det vist noget lang håret noget
men hvordan får jeg det sidste eks (TstringList)til at kigge i hele dir'et
Avatar billede hreiff Nybegynder
04. juni 2002 - 11:38 #6
procedure TForm1.ret(fil: string);
var
  MyList: TStringList;
  indx,i: integer;
  s: string;
begin
  s:= 'op = 5';
  MyList := TStringList.create;
  MyList.LoadFromFile(fil);

  Indx := -1;
  for i := 0 to MyList.Count-1 do
    if s = MyList.strings[i] then Indx := i;

  If (Indx <> -1) then
  begin
    for i := 2 to 12 do
      Mylist.delete(Indx+i);

    MyList.insert(Indx+2, '    coolant = "4"');
    MyList.insert(Indx+3, '    cutfin = "0"');
    MyList.insert(Indx+4, '    descrip = "Copy Milling"');
    MyList.insert(Indx+5, '    feedupr = "40", "upm"');
    MyList.insert(Indx+6, '    feedupr3 = "20", "upm"');
    MyList.insert(Indx+7, '    intol = "0.005"');
    MyList.insert(Indx+8, '    outol = "0.005"');
    MyList.insert(Indx+9, '    section = "1030107"');
    MyList.insert(Indx+10,'    speedcss = "12000", "rpm"');
    MyList.insert(Indx+11,'    stepover = "0.06"');
    MyList.insert(Indx+12,'    user_name = "Copy Milling.5"');

    MyList.SaveToFile(fil);
  end;
  MyList.Free
end;

procedure TForm1.Button1Click(Sender: TObject);
var
s : TSearchRec;
navn,sti: string;
begin
  sti := 'c:\';
  if FindFirst(sti, faAnyFile, s) = 0 then
    begin
      repeat
        if ((s.Attr <> faDirectory) and (s.Name <> '.') and
              (s.Name  <> '..')) then
        Begin
          navn := sti+s.Name;
          Ret(navn);
        End;
      until FindNext(s) <> 0;
  end;
end;
Avatar billede anold Nybegynder
04. juni 2002 - 13:36 #7
Hej Hreiff
Jeg kan ikke få din TForm1.Button1Click til at virke
det virker som om at findfirst ikke finder nogle filer og derfor springer den direkte til END
Tror du at du kan få det til at virke ??
Avatar billede hreiff Nybegynder
04. juni 2002 - 13:42 #8
Du behøver sådan set ikke at slette og sætte ind, men kan bare ændre
dvs.

  for i := 2 to 12 do
      Mylist.delete(Indx+i);

    MyList.insert(Indx+2, '    coolant = "4"');
    MyList.insert(Indx+3, '    cutfin = "0"');
    MyList.insert(Indx+4, '    descrip = "Copy Milling"');
    MyList.insert(Indx+5, '    feedupr = "40", "upm"');
    MyList.insert(Indx+6, '    feedupr3 = "20", "upm"');
    MyList.insert(Indx+7, '    intol = "0.005"');
    MyList.insert(Indx+8, '    outol = "0.005"');
    MyList.insert(Indx+9, '    section = "1030107"');
    MyList.insert(Indx+10,'    speedcss = "12000", "rpm"');
    MyList.insert(Indx+11,'    stepover = "0.06"');
    MyList.insert(Indx+12,'    user_name = "Copy Milling.5"');


ændres til

    MyList.strings[Indx+2] := '    coolant = "4"';
    MyList.strings[Indx+3] := '    cutfin = "0"';
    MyList.strings[Indx+4] := '    descrip = "Copy Milling"';
    MyList.strings[Indx+5] := '    feedupr = "40", "upm"';
    MyList.strings[Indx+6] := '    feedupr3 = "20", "upm"';
    MyList.strings[Indx+7] := '    intol = "0.005"';
    MyList.strings[Indx+8] := '    outol = "0.005"';
    MyList.strings[Indx+9] := '    section = "1030107"';
    MyList.strings[Indx+10]:= '    speedcss = "12000", "rpm"';
    MyList.strings[Indx+11]:= '    stepover = "0.06"';
    MyList.strings[Indx+12]:= '    user_name = "Copy Milling.5"';
Avatar billede hreiff Nybegynder
04. juni 2002 - 13:44 #9
Ok, jeg kigger på det lidt senere - Har ikke tid lige nu.
Prøv at sætte nogle showmessage ind rundt omkring, så du kan se hvad der sker.
Avatar billede hreiff Nybegynder
04. juni 2002 - 19:25 #10
Følgende skal ændres i TForm1.Button1Click:

  if FindFirst(sti, faAnyFile, s) = 0 then

til

  if FindFirst(sti+'*.*', faAnyFile, s) = 0 then

(så den leder efter alle filer - det var lige røget ud ved ændringen til TStringList)
Avatar billede hreiff Nybegynder
04. juni 2002 - 19:48 #11
Jeps, så virker den som den skal.
Hvis du har problemer, så vender du bare tilbage.
Avatar billede anold Nybegynder
06. juni 2002 - 09:41 #12
Hej Heriff
Nu ser det ud til at du har fat i den lange ende !
MEN
Når du sletter linjerne i op5 hå sletter den ikke alle før at den indsætte de nye men den fjerner nogle fra OP6!!!
hvorfor mon det ??
kunne man ikke lave det sådan at man kan se den fil man er ved at redigere i og følge med i de ændringer der bliver lavet ???
Avatar billede hreiff Nybegynder
06. juni 2002 - 09:52 #13
Det er fordi du bruger delete(indx+i)
Lav ændringen:


  for i := 2 to 12 do
      Mylist.delete(Indx+i);

    MyList.insert(Indx+2, '    coolant = "4"');
    MyList.insert(Indx+3, '    cutfin = "0"');
    MyList.insert(Indx+4, '    descrip = "Copy Milling"');
    MyList.insert(Indx+5, '    feedupr = "40", "upm"');
    MyList.insert(Indx+6, '    feedupr3 = "20", "upm"');
    MyList.insert(Indx+7, '    intol = "0.005"');
    MyList.insert(Indx+8, '    outol = "0.005"');
    MyList.insert(Indx+9, '    section = "1030107"');
    MyList.insert(Indx+10,'    speedcss = "12000", "rpm"');
    MyList.insert(Indx+11,'    stepover = "0.06"');
    MyList.insert(Indx+12,'    user_name = "Copy Milling.5"');


ændres til

    MyList.strings[Indx+2] := '    coolant = "4"';
    MyList.strings[Indx+3] := '    cutfin = "0"';
    MyList.strings[Indx+4] := '    descrip = "Copy Milling"';
    MyList.strings[Indx+5] := '    feedupr = "40", "upm"';
    MyList.strings[Indx+6] := '    feedupr3 = "20", "upm"';
    MyList.strings[Indx+7] := '    intol = "0.005"';
    MyList.strings[Indx+8] := '    outol = "0.005"';
    MyList.strings[Indx+9] := '    section = "1030107"';
    MyList.strings[Indx+10]:= '    speedcss = "12000", "rpm"';
    MyList.strings[Indx+11]:= '    stepover = "0.06"';
    MyList.strings[Indx+12]:= '    user_name = "Copy Milling.5"';

Så retter du bare linjerne, og så fungerer det.

Du kan oprette en Memo og kopiere del af eller hele MyList til den, og evt. lave en dialogbox f.eks. 'skal dette her rettes?'

f.eks.

for i := 0 to 13 do
  memo1.add(MyList.strings[i]);

//hreiff
Avatar billede hreiff Nybegynder
06. juni 2002 - 10:06 #14
(det skulle være indx - ikke i)
Avatar billede hreiff Nybegynder
06. juni 2002 - 10:53 #15
vi prøver lige en gang til:

memo1.clear;
for i := 0 to 13 do
  memo1.lines.add(MyList.strings[indx+i]);
Avatar billede anold Nybegynder
06. juni 2002 - 10:57 #16
Hej Hreiff
Nu ser det ud til at virke !!!
Jeg prøver lige at lege lidt med det så kan det være at jeg vender tilbage med et par tillægsspg.
Her er dine point dem har du også arbejdet meget for at få,
Tak for hjælpen
Avatar billede hreiff Nybegynder
06. juni 2002 - 11:40 #17
Du kan f.eks lægge stien i en editbox, og sætte
sti := edit1.text;
i button1 i stedet for sti := 'c:\';
så du kan taste en vilkårligt sti ind, eller du kan lave noget med en opendialog.

og du kan som sagt lave en ret fil Yes/no dialog:

  if messageDlg('ret '+fil+' ?', mtInformation, [mbYes,mbNo], 0)
      = mrYes then
  begin
    MyList.strings[Indx+2] := '    coolant = "4"';
    osv.
    MyList.savetofile(fil);
  end;
   

God fornøjelse.
Avatar billede anold Nybegynder
07. juni 2002 - 07:11 #18
Hej Hreiff
Nu har jeg prøvet programmet af og det virker helt fint
men der er en lille ting jeg havede overset nemlig at det ikke er i alle filerne at der står  'OP = 5' og så får jeg en fejlmelding.
kan man ikke lave det sådan at programmet er ligeglad med fejlen ( Try..Eexcept) elller hvis programmet ikke finder ' OP = 5' så hopper det videre til næste fil
Avatar billede hreiff Nybegynder
07. juni 2002 - 08:33 #19
Der burde ikke være problemer når 'op = 5' ikke optræder - den springer den bare over (det virker ihvertfald her hos mig), men der kan være problemer hvis der ligger f.eks en .exe-fil. Så får du fejlen: 'line too long'. Hvis dine bearbejdnings-filer har en extension (f.eks. abcd.mac kan du komme let over det:

  if FindFirst(sti+'*.mac', faAnyFile, s) = 0 then


men ellers skulle det være muligt at gribe fejlene med en try-except.

Jeg kigger på det lidt senere. Men check lige hvilken type fejl du får.
Avatar billede hreiff Nybegynder
07. juni 2002 - 09:01 #20
Du får lige hele programmet:
(Bemærk at du får fejl når du kører 'gennem' delphi, men den forsvinder når du kører exe-filen.)

unit Ret4m;

interface

uses
  SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  Forms, Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Label1: TLabel;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    procedure ret(fil: string);
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.ret(fil: string);
var
  MyList: TStringList;
  indx,i: integer;
  s: string;
begin
  s:= 'op = 5';
  MyList := TStringList.create;
  try
    MyList.LoadFromFile(fil);
  except
    on eDivByZero do
    begin
    end
    else
    begin
      MyList.clear;
      showmessage('Fejl på '+fil);
    end;
  end;


  Indx := -1;
  for i := 0 to MyList.Count-1 do
    if s = MyList.strings[i] then Indx := i;

  If (Indx <> -1) then
  begin
    memo1.clear;
    for i := 0 to 13 do
      memo1.lines.add(MyList.strings[indx+i]);

    label1.caption := fil;

    if messageDlg('ret '+fil+' ?', mtInformation, [mbYes,mbNo], 0) = mrYes then
    begin
      MyList.strings[Indx+2] := '    coolant = "4"';
      MyList.strings[Indx+3] := '    cutfin = "0"';
      MyList.strings[Indx+4] := '    descrip = "Copy Milling"';
      MyList.strings[Indx+5] := '    feedupr = "40", "upm"';
      MyList.strings[Indx+6] := '    feedupr3 = "20", "upm"';
      MyList.strings[Indx+7] := '    intol = "0.005"';
      MyList.strings[Indx+8] := '    outol = "0.005"';
      MyList.strings[Indx+9] := '    section = "1030107"';
      MyList.strings[Indx+10]:= '    speedcss = "12000", "rpm"';
      MyList.strings[Indx+11]:= '    stepover = "0.06"';
      MyList.strings[Indx+12]:= '    user_name = "YCopy Milling.5"';

      MyList.SaveToFile(fil);
    end;
  end;
  MyList.Free
end;

procedure TForm1.Button1Click(Sender: TObject);
var
s : TSearchRec;
navn,sti: string;
begin
  sti := edit1.text;
  if FindFirst(sti+'*.*', faAnyFile, s) = 0 then
  begin
    repeat
      if ((s.Attr <> faDirectory) and (s.Name <> '.') and (s.Name  <> '..')) then
      Begin
        navn := sti+s.Name;
        Ret(navn);
      End;
    until FindNext(s) <> 0;
  end;
  Memo1.clear;
  Label1.caption := '';
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  memo1.clear;
end;

end.
Avatar billede anold Nybegynder
07. juni 2002 - 09:30 #21
Hej Hreiff
Den fejl jeg får hedder 'List index out of bounds (-1)'
og den kommer hver gang at programmet ikke kan finde nogle linje med 'OP = 5'
Avatar billede hreiff Nybegynder
07. juni 2002 - 11:00 #22
List index out of bounds kommer hvis du prøver at hente indholdet af en linje som ikke eksisterer, f.eks hvis du prøver

for i := 0 to 13 do
      memo1.lines.add(MyList.strings[indx+i]);

når indx er -1 (MyList.strings[-1])

Prøv at kigge på mit program. Der er også indbygget en try.
Avatar billede anold Nybegynder
07. juni 2002 - 11:07 #23
Ja jeg har lige fundet fejlen
det var noget geil jeg havede lavet og ikke dit program der var noget galt med (beklager)
Avatar billede hreiff Nybegynder
07. juni 2002 - 11:28 #24
Ok. Bare vend tilbage hvis du skal bruge mere hjælp.
200 point rækker langt. Hold dig til de anbefalede 15-30-60 point. Eventuelt kan man fylde mere i hvis problemet viser sig at være stort. Ellers løber man hurtigt tør for point (og dermed hjælp).

mvh. Henrik
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester