Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Normaler Text und ASCII Steuerzeichen
basner - Do 28.05.09 11:19
Titel: Normaler Text und ASCII Steuerzeichen
Hallo.
Vielleicht könnt Ihr mir helfen.
Ich habe eine Datei die normalen Text wie: "Das ist eine Frage" aber in dieser Datei befinden sich auch Steuerzeichen wie z.B: Chr(134) usw.
Diesen Text möchte ich ohne die Steuerzeichen in eine Richeditbox laden und anzeigen.
Könnt ihr mir einen Weg nennen wie ich das anstellen kann?
Bin für jede Hilfe dankbar.
jaenicke - Do 28.05.09 11:32
Hallo und :welcome: !
Du könntest den Text in eine Stringvariable legen, mit einer for-Schleife zeichenweise durchgehen und entweder bei allen Zeichen außer Buchstaben, Zahlen, usw. oder explizit bei den von dir gemeinten Zeichen diese durch ein Leerzeichen ersetzen.
Delphi-Quelltext
1: 2: 3:
| for i := 1 to Length(DeinText) do if not (DeinText[i] in ['a'..'z', 'A'..'Z', 'ä', ...]) then DeinText[i] := ' '; |
Bzw. eben umgekehrt.
basner - Do 28.05.09 11:40
Danke für die schnelle und gute Hilfe. Und was kann ich machen wenn ich nur bestimmte Steuerzeichen weg haben möchte?
Ich hoffe die Frage ist nicht zu dumm.
;-)
Yogu - Do 28.05.09 11:46
Dann nimmst du das not weg und ersetzt die erlaubten Zeichen (['a'..'z', 'A'..'Z', 'ä', ...]) durch die nicht erlaubten Zeichen. :idea:
basner - Do 28.05.09 13:38
Danke für die gute und schnelle Hilfe.
Das funktioniert jetzt alles. Nur bekomme ich nun eine Rang Exception oder Violation Exception.
Hier mal das komplette Codestück
Delphi-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:
| If opendialog1.Execute then
begin
i:=0; assignfile(datei,opendialog1.FileName); reset(datei); while not eof(datei) do begin if i=0 then begin readln(datei, s);
for i := 1 to Length(s) do
if not(s[i] in ['a'..'z', 'A'..'Z', '0'..'9', 'ä', '.', ',']) then s[i] := ';';
end;
end else begin readln(datei, s[i- 1]); RichEdit1.Lines.Add(s+#13#10); i:=+1;
end;
end;
closefile(datei); end;
Except Application.MessageBox('Beim einlesen der Datei ist ein Fehler aufgetreten.','',MB_OK + MB_ICONERROR) End; |
Vielen Dank
Moderiert von
Gausi: Code- durch Delphi-Tags ersetzt
jaenicke - Do 28.05.09 13:50
Rück ordentlich ein, dann siehst du auch wo dein Fehler liegt... :roll:
Delphi-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:
| if OpenDialog1.Execute then begin i := 0; AssignFile(datei, OpenDialog1.FileName); reset(datei); while not eof(datei) do begin if i = 0 then begin readln(datei, s);
for i := 1 to Length(s) do if not(s[i] in ['a'..'z', 'A'..'Z', '0'..'9', 'ä', '.', ',']) then s[i] := ';'; end; end else begin readln(datei, s[i- 1]); RichEdit1.Lines.Add(s+#13#10); i := +1; end; end; closefile(datei); end; Except Application.MessageBox('Beim einlesen der Datei ist ein Fehler aufgetreten.','',MB_OK + MB_ICONERROR) End; |
basner - Do 28.05.09 13:54
Danke habe das Else komplett entfernt aber der Fehler besteht weiterhin. hmm....
Leider habe ich dann noch ein zweites Problem, die Datei die dargestellt werden soll ist 17 MB groß, aber es werden nur ein paar Zeilen eingelesen.
jaenicke - Do 28.05.09 14:22
Wofür überhaupt das if? Da du nach der Schleife nicht weißt welchen Wert i hat, ist das doch ohnehin Glücksspiel.
Aufgrund der Optimierung wird i vermutlich nach der Schleife 0 sein, da die Schleife rückwärts läuft. Definiert ist der Wert einer Schleifenvariablen nach der Schleife schlicht gar nicht.
Und wenn es 0 ist, machst mit dem s nix.
// EDIT:
Und was erwartest du was readln(datei, s[i- 1]); tut?
Und warum weist du i immer den Wert 1 zu?
basner - Do 28.05.09 14:41
Wäre es möglich das du mir den Code kurz umstellst das es funktioniert. Habe erst angefangen mit Delphie.
Und so könnt ich die Fehler genau sehen.
Vielen Dank.
jaenicke - Do 28.05.09 14:53
Das Problem ist die Größe der Datei. Das dauert vermutlich ewig auf normalem Weg. Ein Versuch:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| var FileStream: TFileStream; FileContents: AnsiString; CurrentBuffer: PAnsiChar; begin FileStream := TFileStream.Create('...', fmOpenRead); try SetLength(FileContents, FileStream.Size); FielStream.ReadBuffer(PAnsiChar(FileContents)^, FileStream.Size); CurrentBuffer := PAnsiChar(FileContents); for i := 1 to Length(FileContents) do begin if CurrentBuffer^ in [#134, ';'] then CurrentBuffer^ := ' '; Inc(CurrentBuffer); end; RichEdit1.Lines.Text := FileContents; finally FileStream.Free; end; end; |
Ich hoffe ich habe mich nirgends vertan.
basner - Do 28.05.09 15:01
Und in Verbindung mit OpenfileDialog?
Und habe ich es richtig verstanden, das du in deinem Code nur ein Chr abfragst oder gibt es da wieder die Möglichkeit mehrere Abzufragen?
//EDIT
Hatte noch das gefunden kann es aber nicht in Verbindung bringen, vielleicht kann man es ja in die source einbauen
SA: array[136..256] of char;
jaenicke - Do 28.05.09 15:04
Ich frage bei mir ab, ob es sich um das von dir genannte Zeichen 134 oder ; ist, und wenn ja, ersetze ich es durch ein Leerzeichen. Die Liste der Trennzeichen kannst du ja erweitern oder die Abfrage wie oben negieren, wenn du die erlaubten statt der Trennzeichen angeben willst.
Und den Dialog musst du ja nur dazusetzen, um den Dateinamen zu haben. Den habe ich bei mir ja freigelassen...
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!