Avatar billede anold Nybegynder
06. april 2001 - 08:12 Der er 7 kommentarer og
1 løsning

opdelning af tekstfil

Jeg har en tekstfil der ser såden her ud:

Otest10
G90 G53 G0 Z0
G0 X119.8 Y0.
Z2.
G1 X-102.593 Y1.348
X-103.5
Z2.
M99
%
Otest20
G90 G53 G0 Z0
Z2. M8
G1 Z-.8 F1200.
M99
%
Otest30
G90 G53 G0 Z0
G1 Y-5.056
G0 Z2.
M30

nu vil jeg gerne lave et program der kan splitte tekstfilen op, i dette her eks. i 3 filer, som får navn efter den tekst der står bag efter O\'et (feks test10) og hvor jeg selv kan bestemme hvor jeg vil gemme filerne.

hvordan gør jeg det
Hilsen anold
Avatar billede pellelil Nybegynder
06. april 2001 - 08:21 #1
var
  FileName : String;
  FileActive : Boolean;
  Line : String;
  InputFile: File of Text;
  OutputFile: File of Text;
begin
  FileActive := False;
  AssignFile(InputFile, \'NavnetPåInput-file.txt\');
  Reset(InputFile);
  While not EOF(InputFile) do begin
    ReadLn(InputFile, Line);
    if (Length(Line) > 0) and (Line[1] = \'O\') then begin
      If FileActive then begin
        CloseFile(OutputFile);
        FileActive := False;
      end;
      if Length(Line) > 2 then begin
        FileName := Copy(Line, 2, Length(Line)-1);
        //evt:  FileName := FileName + \'.TXT\';
        AssignFile(OutputFile, FileName);
        ReWrite(OutputFile);
        FileActive := True;
      end;
    end else begin
      if FileActive then begin 
        WriteLn(OutputFile, Line);
      end;
    end;
  end;
end;
Avatar billede anold Nybegynder
06. april 2001 - 08:53 #2
hej pellelil
jeg skal lige prøve dit eks.
men jeg vil lige høre om det er muligt at programmet selv vælger at åbne den nyeste fil der er i mappen (f.eks målt på klokken)

jeg skal også lige høre om hvor din kode skal ligge, er det på en knap eller er det på formens onactivate
Hilsen anders
Avatar billede anold Nybegynder
06. april 2001 - 09:04 #3
hej pellelil
når jeg prøver at starte dit program fær jeg denne fejl :
[Error] main.pas(150): Constant or type identifier expected

fejlen kommer ved variablen :  InputFile: File of Text;

hvorfor gør jeg det
hilsen anold
Avatar billede pellelil Nybegynder
06. april 2001 - 09:06 #4
Hvis den skal åbne den seneste fil så skal du til at kigge på noget \"FindFirst\" / \"FindNext\" (prøve at kigge på det i hjælpen). Hvis du ikke bliver klogere så har du her en kode stump fra et af mine programmer (det konvertere automatisk alle BMP/TIF filer til JPG). For hver fil den finder kalder den \"ProcessBMPfile\", som er den rutine der fysisk konvertere filen (så fremt denne er en BMP eller TIF). Hvis den i stedet (for en fil) \"finder\" en folder, så kalder ScanTree sig selv rekursiv således at den også kigger i under-mapper:
<SNIP>
Procedure ScanTree(szFolder : String);
var
  szUNCfolder : String;
  lExclude    : Boolean;
  iIdx        : Integer;
  VSearchRec  : TSearchRec;
  iRes        : integer;
  iFileAttrs  : Integer;
  szFileName  : String;
begin
  //--- Check if Poll is running ---
  if not(FormMain.lRunning) then Exit;
  //--- Check if folder is to be Excluded ---
  szUNCfolder := ExpandUNCFileName(szFolder);
  lExclude := False;
  if FccRegDb.ExcludeFolders.Count > 0 then begin
    for iIdx := 0 to FccRegDb.ExcludeFolders.Count-1 do begin
      if pos(AnsiUpperCase(ExpandUNCFileName(FccRegDb.ExcludeFolders.Strings[iIdx])),AnsiUpperCase(szUNCfolder)) > 0 then
        lExclude := True;
    end;
  end;
  if lExclude then Exit;
  //--- Proceed looking for files and sub-folders ---
  iFileAttrs := faDirectory{ or faAnyFile};
  szFileName := szUNCfolder;
  if (CopyLast(szFileName,1) <> \'\\\') then szFileName := szFileName + \'\\\';
  szFileName := szFileName + \'*.*\';
  if FindFirst(szFileName, faAnyFile, VSearchRec) = 0 then begin
    szFileName := szUNCfolder;
    if (CopyLast(szFileName,1) <> \'\\\') then szFileName := szFileName + \'\\\';
    szFileName := szFileName + VSearchRec.Name;
    if (CopyLast(VSearchRec.Name,1) <> \'.\') then begin
      if ((VSearchRec.Attr and faDirectory) = faDirectory) then ScanTree(szFileName)
                                                          else ProcessBMPfile(szFileName);
    end;
    while (FindNext(VSearchRec) = 0) and (FormMain.lRunning) do begin
      Application.ProcessMessages;
      szFileName := szUNCfolder;
      if (CopyLast(szFileName,1) <> \'\\\') then szFileName := szFileName + \'\\\';
      szFileName := szFileName + VSearchRec.Name;
      if (CopyLast(VSearchRec.Name,1) <> \'.\') then begin
        if ((VSearchRec.Attr and faDirectory) = faDirectory) then ScanTree(szFileName)
                                                            else ProcessBMPfile(szFileName);
      end;
    end;
  end;
  FindClose(VSearchRec);
end;
</SNIP>

Med hensyn til om min kode skal udføres på det ene eller det andet tidspunkt kan jeg ikke svare på (det burde du vide) - jeg håber at du ved hvordan din egen applikation skal udføres !?).

Avatar billede pellelil Nybegynder
06. april 2001 - 09:08 #5
Prøv med \"TextFile\" i stedet for \"File Of Text\" (begge steder)
Avatar billede anold Nybegynder
06. april 2001 - 09:34 #6
Hej Pellelil
Nu har jeg testet dit program og det ser ud til at virke nogenlunde som jeg vil have det til.
Men den fil jeg får ud ser sådan her ud:

G90 G53 G0 Z0
G0 X119.8 Y0.
Z2.
G1 X-102.593 Y1.348
X-103.5
Z2.
M99

men den skulle gerne se sådan her ud :

Otest10
G90 G53 G0 Z0
G0 X119.8 Y0.
Z2.
G1 X-102.593 Y1.348
X-103.5
Z2.
M99
%

som du kan se så læser dit program ikke den første og den sidste linje ,kan du få det til at  læse dem?

som jeg også skrev i starten så vil jeg gerne selv kunne bestemme hvovr jeg gemmer filerne henne, kan det ikke også lade sig gøre.

du skriver at :

\" Med hensyn til om min kode skal udføres på det ene eller det andet tidspunkt kan jeg ikke svare på (det burde du vide) - jeg håber at du ved hvordan din egen applikation skal udføres !?). \"

jeg tror at du misforstår mig ,det som jeg gerne ville var at programmet selv fandt den nyeste fil og læste i den, således at man var fri for at bruge en OpenDialogBox.

Venlig hilsen
Anold




Avatar billede pellelil Nybegynder
06. april 2001 - 10:03 #7
Det var med fuld overlæg at jeg ikke skrive den første linie (den der indeholderO\'et), men det gør den så nu:
<SNIP>
var
  FileName : String;
  FileActive : Boolean;
  Line : String;
  InputFile: File of Text;
  OutputFile: File of Text;
begin
  FileActive := False;
  AssignFile(InputFile, \'NavnetPåInput-file.txt\');
  Reset(InputFile);
  While not EOF(InputFile) do begin
    ReadLn(InputFile, Line);
    if (Length(Line) > 0) and (Line[1] = \'O\') then begin
      If FileActive then begin
        CloseFile(OutputFile);
        FileActive := False;
      end;
      if Length(Line) > 2 then begin
        FileName := Copy(Line, 2, Length(Line)-1);
        //evt:  FileName := FileName + \'.TXT\';
        AssignFile(OutputFile, FileName);
        ReWrite(OutputFile);
        WriteLn(OutputFile, Line);  //*** Ny linie ***
        FileActive := True;
      end;
    end else begin
      if FileActive then begin 
        WriteLn(OutputFile, Line);
      end;
    end;
  end;
  if FileActive then CloseFile(OutputFile);  // *** Ny Linie ***
end;
</SNIP>
Avatar billede pellelil Nybegynder
06. april 2001 - 10:10 #8
Jeg kan ikke se hvorfor den ikke skulle skrive den sidste linie. Jeg \"glemte\" at lukke den sidst åbnede fil, måske dette kunne få den sidste linie til at forsvinde, men dette skulle ikke længere være problemet.

Med hensyn til hvor du skal gemme filen så skal du selvfølgelig bare sætte et sti-navn foran det navn der læses ud fra din O-værdi (hvor svært ka\' det være):
<SNIP>
FileName := Copy(Line, 2, Length(Line)-1);
FileName := \'C:\\En\\Eller\\Anden\\Folder\\\' + FileName + \'.TXT\';
</SNIP>

Nej jeg misforstod dig ikke. Med \"FindFirst\" / \"FindNext\" kan du løbe gennem et \"direktory\" og finde den fil du mener opfylder dine betingelser for at være den rigtige. Hvis programmet ikke skal vises en dialog hvor brugeren skal tage stilling til noget, så kan du evt. putte koden ind i \"OnCreate\". Du kan lade dit hoved program generere en Form hvortil du tilknytter denne kode. Hoved programmet skal således blot \"create\" dene form, men behøver ikke at lave en Show på denne.
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