Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Fehlerhafte Textdatei (https://www.delphipraxis.net/70266-fehlerhafte-textdatei.html)

winkelmesser 27. Mai 2006 21:55


Fehlerhafte Textdatei
 
Bevor ich mein Problem schildere möchte ich allen Usern ein großes Lob aussprechen :thumb:

Zu meinem Problem
Ich bekomme Textdateien die Unterschiedlich groß sind und einige Zeilen haben am Zeilenanfang dieses Zeichen  ab dieser Position wird die Datei nicht weiter ausgelesen.

Auszug aus der Datei
%_N_16099_11_D155_E1_MPF
;$PATH=/_N_WKS_DIR/_N_EASYSTEP_WPD
G0 G90 Z1540
M5 M35
M30
%_N_16099_11_D181_E1_MPF
;$PATH=/_N_WKS_DIR/_N_EASYSTEP_WPD
M4 M24
E_T(18)


Die Function sieht so aus
Delphi-Quellcode:
function TextRep(text : String): integer;
var TextLesen : array[1..10000] of string;
var i, z : integer;
begin
  z:=0;
  AssignFile(f,form1.FileListBox1.FileName);
  reset(f);
  while not eof(f) do
    begin
      Readln(f,TextLesen[z]);
      inc (z);
    end;
  closefile(f);
  AssignFile(f,'C:\test.MPF');
  ReWrite(f);
  for i := 0 to z do
  begin
    writeLn(f,TextLesen[i]);
  end;
  closefile(f);
end;
wie kann ich es anstellen das diese Zeichen gelöscht werden und bis zum Dateiende gelesen wird.

Winkelmesser

[edit=SirThornberry]Delphi-Tags ergänzt - Mfg, SirThornberry[/edit]

mkinzler 27. Mai 2006 21:57

Re: Fehlerhafte Textdatei
 
Versuch mal die datei als binäre datei, statt Textdatei einzulesen.

winkelmesser 27. Mai 2006 22:03

Re: Fehlerhafte Textdatei
 
Hallo mkinzler

Habe es bis jetzt nur als Textdatei versucht muss mal sehen ob ich es binäre hinbekomme

Dank in Voraus

SirThornberry 27. Mai 2006 22:34

Re: Fehlerhafte Textdatei
 
Readln und Array of String verträgt sich nicht auf die Weise wie du es verwendest. Ich denke du meinst eher
Delphi-Quellcode:
var TextLesen : array[1..10000] of char;

winkelmesser 27. Mai 2006 23:01

Re: Fehlerhafte Textdatei
 
Hallo SirThornberry

var TextLesen : array[1..10000] of char;

bringt eine Fehlermeldung
muss ich noch was ändern

Winkelmesser

Amateurprofi 28. Mai 2006 00:10

Re: Fehlerhafte Textdatei
 
Zitat:

Zitat von SirThornberry
Readln und Array of String verträgt sich nicht auf die Weise wie du es verwendest. Ich denke du meinst eher
Delphi-Quellcode:
var TextLesen : array[1..10000] of char;

@SirThornberry
es handelt sich nicht um ein dynamisches array of string sondern um ein statisches array[1..10000} of string und bei mir verträgt es sich ausgezeichnet mit ReadLn.

@winkelmesser
dein array ist definiert als TextLesen:array[1..10000] of string, also solltest du nicht versuchen in TextLesen[0] zu schreiben
Delphi-Quellcode:
begin
  z:=0;
  AssignFile(f,form1.FileListBox1.FileName);
  reset(f);
  while not eof(f) do
    begin
     inc (z);
     Readln(f,TextLesen[z]);
      //inc (z); gehört vor das ReadLn
    end;
  closefile(f);
  AssignFile(f,'C:\test.MPF');
  ReWrite(f);
  // for i := 0 to z do sollte bei 1 beginnen
  for i := 1 to z do
  begin
    writeLn(f,TextLesen[i]);
  end;
  closefile(f);
end

winkelmesser 28. Mai 2006 08:19

Re: Fehlerhafte Textdatei
 
Hallo Amateurprofi

array[1..10000] of tring; verträgt sich auch bei mir

aber das ist nicht mein Problem ich kann nicht die Zeile mit diesen Zeichen Lesen ich nehme an es bedeutet Dateiende

Was ich brauche ist
Die Ganze Datei Zeilenweise einzulesen und diese zeichen zu Löschen


Winkelmesser

SirThornberry 28. Mai 2006 08:26

Re: Fehlerhafte Textdatei
 
Bin ich etwas vewundert das es so geht, da die Länge des String nirgends gesetzt wird...
Hast du es schon mit TFileStream probiert?

winkelmesser 28. Mai 2006 09:31

Re: Fehlerhafte Textdatei
 
Hast du es schon mit TFileStream probiert?

Nein bin noch am suchen komme nicht ganz klar damit :wall:

DP-Maintenance 28. Mai 2006 09:48

DP-Maintenance
 
Dieses Thema wurde von "JasonDX" von "Freeware" nach "Sonstige Fragen zu Delphi" verschoben.
Gehoert nicht nach Freeware ;)

marabu 28. Mai 2006 11:18

Re: Fehlerhafte Textdatei
 
Herzlich willkommen in der Delphi-PRAXiS, winkelmesser.

Deine Textdateien sind ganz sicher keine. Das Zeichen, ab dem die Textdatei nicht weiter gelesen wird, ist das Steuerzeichen EOF (#26). Es signalisiert der Leseroutine das Ende der Datei. Da die Leseroutinen unabhängig vom Kommunikationskanal sein sollen, wird so auch bei Dateien das vorzeitige Ende erreicht - obwohl das Dateisystem genau weiß, dass noch viele Zeichen danach folgen. Da hilft tatsächlich nur das Öffnen als untypsierte Datei oder FileStream. Aber selbst dann kommst du nicht so richtig weiter, wenn du nicht den internen Aufbau der Datei kennst.

Wenn du "Textdatei" vermutest, dann vielleicht deshalb, weil die Datei mit einem Textverarbeitungsprogramm erstellt wurde? Vielleicht haben diese Dateien alle die gleiche Dateinamenserweiterung? Oder weißt du sogar mit welchem Programm sie erzeugt wurden? Was willst du mit diesen Dateien machen?

Freundliche Grüße vom marabu

winkelmesser 28. Mai 2006 13:27

Re: Fehlerhafte Textdatei
 
Schade :cry: und dank an allen

Die Datei kommt von einer CNC Drehmaschine und ist eine Kompletsicherung der eigenen CNC Programme

Es gibt zwei Möglichkeiten die Programme ca. 250 von der CNC auf einen PC zu sichern

1. Mann notiert sich die Programmnamen und gibt diese am PC im Programm der den Datentransfer steuert ein und startet den Transfer und das ca. 250 mal.
2. Mann gibt irgendeinen Namen ein und macht eine Komplettsicherung von allen Programmen auf einmal.


Und jetzt kommt mein Programm ins Spiel mein Erstes!

In einer FileListBox wähle ich die Komplettsicherung aus
In der CheckListBox werden dann alle Programme Aufgelistet und man kann eine oder auch alle auf mal erstellen lassen

Klappt ja auch sehr gut wenn einige Dateien nicht dieses Zeichen „EOF (#26) „ in einigen Zeilen hätten.


winkelmesser

marabu 28. Mai 2006 14:09

Re: Fehlerhafte Textdatei
 
Liste der Anhänge anzeigen (Anzahl: 1)
Nicht aufgeben. Es ist etwas schwieriger, aber nicht unlösbar. Du musst einfach nur die Gesamtdatei zeichenweise in einen String einlesen. Bei jedem Vorkommen von EOF nimmst du den bis dahin erhaltenen String und weist ihn der Text-Eigenschaft einer StringList zu. Dadurch wird dir der String in Programmzeilen zerlegt. In der ersten Zeile steht der Programmname, gekennzeichnet durch ein Prozentzeichen am Zeilenbeginn. In der zweiten Zeile steht der Speicherpfad. Die restlichen Zeilen sind ProgrammCode. Du musst nur die zwei ersten Zeilen interpretieren und daraus einen Namen für das Dateisystem erzeugen. Mit diesem Namen kannst du dann den Code für das CNC-Programm mit der Methode StringList.SaveToFile() auf deiner Festplatte speichern.

Du schaffst das.

marabu


Edit: Im Anhang meine Lösung - falls du später vergleichen möchtest. Es ist ein Konsolenprogramm und meine Testdaten habe ich beigepackt. Der Aufruf geschieht mit zwei Parametern, aber das sagt das Programm, wenn man es ohne aufruft.

winkelmesser 29. Mai 2006 14:23

Re: Fehlerhafte Textdatei
 
Dank an marabu :thumb:

Hat lange gedauert :oops: aber es klappt echt Super :lol:

Und so sieht der Programmcode aus

Delphi-Quellcode:
procedure Tform1.TextRep(sender: TObject);
  var sl : TStringList;
begin
  sl := TStringList.Create;
  sl.LoadFromFile(verzP);
  [b]sl.Text := StringReplace(sl.Text, '', '', [rfReplaceAll]);[/b]
  sl.SaveToFile(verzP);
  form1.FileListBox1.Refresh;
end;
Edit:
ein Problem habe ich noch wenn die Datei Schreibgeschützt ist gibt er eine Fehlermeldung aus

Winkelmesser

[edit=SirThornberry]Delphi-Tags ergänzt - Mfg, SirThornberry[/edit]

Klaus01 29. Mai 2006 14:31

Re: Fehlerhafte Textdatei
 
Hallo Winkelmesser,

Du kannst ja vorher das Attribut entsprechend setzen -> http://www.delphipraxis.net/internal...ct.php?t=60283

oder auch damit -> function FileSetAttr(const FileName: string; Attr: Integer): Integer;

Grüße
Klaus


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:55 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz