Autor Beitrag
basner
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 39



BeitragVerfasst: Do 28.05.09 11:19 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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.
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 39



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 39



BeitragVerfasst: 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

ausblenden volle Höhe 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// Ende Try


Vielen Dank

Moderiert von user profile iconGausi: Code- durch Delphi-Tags ersetzt
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 28.05.09 13:50 
Rück ordentlich ein, dann siehst du auch wo dein Fehler liegt... :roll:
ausblenden 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 // else? bei while? ô.O
  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// Ende Try
basner Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 39



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 39



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 28.05.09 14:53 
Das Problem ist die Größe der Datei. Das dauert vermutlich ewig auf normalem Weg. Ein Versuch:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 39



BeitragVerfasst: 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;


Zuletzt bearbeitet von basner am Do 28.05.09 15:04, insgesamt 1-mal bearbeitet
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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...