Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi zeilenumbruch in text-file löschen (https://www.delphipraxis.net/65845-zeilenumbruch-text-file-loeschen.html)

ArminF 21. Mär 2006 12:12


zeilenumbruch in text-file löschen
 
Moin,

hab grad ein kleines problem (abgesehen davon daß ich ein blutiger delpi2005-laie bin und erst seit einigen monaten wieder begonnen habe, ein wenig just for fun zu programmieren...):

für ein kleines simples programm benötige ich ein textfile. Die Rohdaten dazu sozusagen sind DNA-Sequenzen, die mit Zeilenumbruch in Datenbanken im Internet zu finden sind.
Um innerhalb dieser DNA-Sequenz etwas zu suchen, stört mich dieser Zeilenumbruch, weshalb ich mit Hilfe eines Word-Makros die Zeilenumbrüche alle lösche und dann diese große große Zeile, die dabei entsteht, in eine .txt-Datei speichere, mit der ich dann im Programm arbeite.

Jetzt meine Frage: (Wie) kann ich in einer Textdatei direkt in Delphi die Zeilenumbrüche am Ende jeder Zeile löschen?

PS. für Interessierte kann ich auch gerne etwas mehr zu dem Programm sagen, aber ich wollte jetzt gleich bei meiner ersten Frage mit allzu vielen Nebensächlichkeiten nerven :-)

Grüße

armin

moonwhaler 21. Mär 2006 12:18

Re: zeilenumbruch in text-file löschen
 
Hallo,

versuch es mal mit der Funktion "StringReplace". Als Suchstring verwendest du "\n" und ersetzen tust du es durch "" (leer) oder ein Freizeichen - je nach Bedarf. Möglich ist auch die Suche nach "\n" via der Funktion "POS", um die genaue Position herauszufinden und dies via "DELETE" aus dem Text zu löschen... Viele Wege führen nach Rom.

Grüße.

ArminF 21. Mär 2006 12:21

Re: zeilenumbruch in text-file löschen
 
Zitat:

Zitat von moonwhaler
Hallo,

versuch es mal mit der Funktion "StringReplace". Als Suchstring verwendest du "\n" und ersetzen tust du es durch "" (leer) oder ein Freizeichen - je nach Bedarf. Möglich ist auch die Suche nach "\n" via der Funktion "POS", um die genaue Position herauszufinden und dies via "DELETE" aus dem Text zu löschen... Viele Wege führen nach Rom.

Grüße.

steht dieses "\n" für einen Zeilenumbruch oder wie kommt es zu diesem Ausdruck?

Danke schon mal für deine fixe antwort, werd das nachher mal ausprobieren...

sakura 21. Mär 2006 12:23

Re: zeilenumbruch in text-file löschen
 
StringReplace ist meiner Erfahrung nach für größere Datenmengen viel zu langsam, aber versuchen kannst Du es ja mal.

"\n" geht in Delphi natürlich nicht. Jetzt kommt es aber erst einmal darauf an, wie der Zeilenumbruch in den Dateien definiert ist. Einfach mal (fürs erste) StringReplace mit #13#10 bzw. #10 als zu Suchenden String testen.

...:cat:...

holliesoft 21. Mär 2006 12:25

Re: zeilenumbruch in text-file löschen
 
Hi,

Ich würde die Datei in eine StringList laden und dann StringReplace benutzen:

Delphi-Quellcode:
Var Source: TStringList;
[...]
Source := TStringList.Create;
Source.LoadFromFile ('c:\datei.txt');
Source.Text := StringReplace (Source.Text, #13#10, '', [rfReplaceAll]);
Source.SaveToFile;
Wegen der Geschwindigkeit: Mache ähnliches mit Dateien bis 5 MB Größe und die Geschwindigkeit ist OK.


Gruß
Hollie

Hansa 21. Mär 2006 12:31

Re: zeilenumbruch in text-file löschen
 
Erst mal herzlich willkommen in der Delphi-Praxis an alle Neu-Poster. Gilt aber auch für Sakura. :lol: Ja, viele Wege führen nach Rom. Hier noch einer : zeilenweise lesen und Zeilen aneinanderhängen.

Delphi-Quellcode:
var t : textfile;
    zeile,
    gesamt : string;
begin  
...// Datei öffnen
  gesamt := '';
  readln (t,zeile);
  gesamt := gesamt + zeile;
...// wegschreiben und Datei schliessen
end.
[edit=Luckie]Und an den alten Poster, der anscheinend noch keine Delphi-Tags kennt. ;) Mfg, Luckie[/edit]

moonwhaler 21. Mär 2006 13:07

Re: zeilenumbruch in text-file löschen
 
EDIT:
Wurde bereits alles erwähnt. Sorry an die Moderatoren... Hab ich zu spät bemerkt.

ichbins 21. Mär 2006 13:27

Re: zeilenumbruch in text-file löschen
 
@Hansa: War schon ein guter Anfang ;) aber ich würde an deiner Stelle auch noch speicherschonend speichern. Wenn du das, was du da machst, bei einer 2,01-GB-Textdatei (:shock: ;)) versuchst, wird es aus RAM-Mangel unter einem 32-Bit-System, d.h. mindestens bis Delphi2007/WinVista/64bit Prozessor/4GBRAM nicht klappen ;)

Delphi-Quellcode:
procedure entfernezeilenumbrueche(filename:string);
var
  f,t:textfile;
  zeile:string;
begin
  assignfile(f,filename);
  reset(f);
  assignfile(t,filename+'.tmp');
  rewrite(t);
  while not eof(f) do begin
    readln(f,zeile);
    write(t,zeile+' ');
  end;
  closefile(f);
  closefile(t);
end;

ArminF 21. Mär 2006 14:26

Re: zeilenumbruch in text-file löschen
 
sodele,

ich sag mal allen danke. werde dann mal mein glück versuchen :wink:

ArminF 21. Mär 2006 16:07

Re: zeilenumbruch in text-file löschen
 
Code:
var
  f1, t1 : text;
  zeile : string;

begin
  writeln ('Bitte speichern Sie die komplette cDNA-Sequenz in d:\armin\cNDA.txt');
  writeln ('Bitte Datei wieder schliessen und mit RETURN bestaetigen!');
  readln;
  writeln;
  assign (f1,'d:\armin\codeX\cDNA.txt');
  reset (f1);
  assign (t1,'d:\armin\codeX\cDNA_tmp.txt');
  reset (t1);
  while not eof(f1) do
    begin
      readln (f1,zeile);                                                        
      write(t1,zeile);                                                          
    end;
  read (t1, cDNAgesamt);
  close (f1);
  close (t1);
end;
aargh... ich krieg die krätze... jetzt kackt mir das programm andauernd ab.

Problem: ich will den kompletten text aus t1 in den string cDNAgesamt kopieren. Macht man ja mit

Code:
read(t1,cDNAgesamt);
sag ich allerdings

Code:
read(f1,cDNAgesamt);
kackt mir nix ab, was mir aber nicht weiterhilft, da ich ja in f1 die textdatei MIT zeilenumbruch habe...

kann mir mal jemand sagen auf welchem schlauch ich sitze?

xaromz 21. Mär 2006 16:39

Re: zeilenumbruch in text-file löschen
 
Hallo,

Du solltest vielleicht nach dem Schreiben von t1 den Dateizeiger mit Delphi-Referenz durchsuchenSeek zurücksetzen, sonst liest Du nach dem Ende der Datei.

Gruß
xaromz

Hansa 21. Mär 2006 16:49

Re: zeilenumbruch in text-file löschen
 
Zitat:

Zitat von ArminF
aargh... ich krieg die krätze... jetzt kackt mir das programm andauernd ab.

Und das wundert Dich auch noch ? Reset <F1> und dann mal genau gucken. Das andere fängt auch mit re... an. :lol:

ArminF 21. Mär 2006 16:51

Re: zeilenumbruch in text-file löschen
 
Delphi-Quellcode:
procedure cDNAEingabe;                                                         {Eingabe der cDNA}

var
  f1, t1 : text;
  zeile : string;

begin
  writeln ('Bitte speichern Sie die komplette cDNA-Sequenz');
  writeln ('OHNE ZEILENUMBRUCH in d:\armin\cNDA.txt');
  writeln ('Bitte Datei wieder schliessen und mit RETURN bestaetigen!');
  readln;
  writeln;
  assign (f1,'d:\ARMIN\codeX\cDNA.txt');
  rewrite (f1);
  assign (t1,'d:\ARMIN\codeX\cDNA_tmp.txt');
  reset (t1);
  while not eof(f1) do
    begin
      readln (f1,zeile);        {liest aus f1 eine Zeile und speichert in "zeile"}
      write(t1,zeile);          {schreibt in t1 den Inhalt von zeile}
    end;
  seek (t1,0);
  read (t1,cDNAgesamt);
  close (f1);
  close (t1);
end;
...bekomm ich als fehlermeldung "inkompatible typen" bei der zeile

Delphi-Quellcode:
seek (t1,0);
kann es sein, dass seek bei textdateien nicht funktioniert?

ArminF 21. Mär 2006 16:54

Re: zeilenumbruch in text-file löschen
 
Zitat:

Zitat von Hansa
Zitat:

Zitat von ArminF
aargh... ich krieg die krätze... jetzt kackt mir das programm andauernd ab.

Und das wundert Dich auch noch ? Reset <F1> und dann mal genau gucken. Das andere fängt auch mit re... an. :lol:

hä?! jetzt versteh ich nur bahnhof :roll: ...und was bitte fängt auch mit re... an?! Bitte keine armen verstreuten akademiker verwirren, bitte :lol:

Hansa 21. Mär 2006 17:04

Re: zeilenumbruch in text-file löschen
 
1. nachträglich geänderter Quelltext ist für Fragesteller selber nicht gut. (reset <-> rewrite) 8)

2. Folgefehler : Logik schreiben/lesen nicht ganz klar, was ?


Zitat:

Zitat von ArminF
Delphi-Quellcode:
  while not eof(f1) do
    begin
      readln (f1,zeile);                                                        {liest aus f1 eine Zeile und speichert in "zeile"}
      write(t1,zeile);                                                          {schreibt in t1 den Inhalt von zeile}
    end;
  seek (t1,0);
  read (t1,cDNAgesamt);
  close (f1);
  close (t1);
end;


3. Wozu überhaupt close ?

4. Was soll das seek bewirken ?

F1 bewirkt Wunder ! 8)

xaromz 21. Mär 2006 17:05

Re: zeilenumbruch in text-file löschen
 
Hallo,
Zitat:

Zitat von ArminF
hä?! jetzt versteh ich nur bahnhof :roll: ...und was bitte fängt auch mit re... an?! Bitte keine armen verstreuten akademiker verwirren, bitte :lol:

Du hast Rewrite und Reset vertauscht. Du öffnest die Quelldatei zum Schreiben und die Zieldatei zum Lesen.
Versuch's mal so:
Delphi-Quellcode:
procedure cDNAEingabe;                                                         {Eingabe der cDNA} 

var
  f1, t1 : text;
  zeile : string;

begin
  writeln ('Bitte speichern Sie die komplette cDNA-Sequenz');
  writeln ('OHNE ZEILENUMBRUCH in d:\armin\cNDA.txt');
  writeln ('Bitte Datei wieder schliessen und mit RETURN bestaetigen!');
  readln;
  writeln;
  assign (f1,'d:\ARMIN\codeX\cDNA.txt');
  reset (f1);         // <- hier
  assign (t1,'d:\ARMIN\codeX\cDNA_tmp.txt');
  rewrite (t1);       // <- und hier
  while not eof(f1) do
    begin
      readln (f1,zeile);                                       {liest aus f1 eine Zeile und speichert in "zeile"} 
      write(t1,zeile);                                         {schreibt in t1 den Inhalt von zeile} 
    end;
  close (t1); // <- statt Seek: einfach neu öffnen
  reset (t1);
  read (t1,cDNAgesamt);
  close (f1);
  close (t1);
end;
Gruß
xaromz

ArminF 21. Mär 2006 17:12

Re: zeilenumbruch in text-file löschen
 
Zitat:

Zitat von xaromz
Hallo,
Zitat:

Zitat von ArminF
hä?! jetzt versteh ich nur bahnhof :roll: ...und was bitte fängt auch mit re... an?! Bitte keine armen verstreuten akademiker verwirren, bitte :lol:

Du hast Rewrite und Reset vertauscht. Du öffnest die Quelldatei zum Schreiben und die Zieldatei zum Lesen.
Versuch's mal so:
Delphi-Quellcode:
procedure cDNAEingabe;                                                         {Eingabe der cDNA} 

var
  f1, t1 : text;
  zeile : string;

begin
  writeln ('Bitte speichern Sie die komplette cDNA-Sequenz');
  writeln ('OHNE ZEILENUMBRUCH in d:\armin\cNDA.txt');
  writeln ('Bitte Datei wieder schliessen und mit RETURN bestaetigen!');
  readln;
  writeln;
  assign (f1,'d:\ARMIN\codeX\cDNA.txt');
  reset (f1);         // <- hier
  assign (t1,'d:\ARMIN\codeX\cDNA_tmp.txt');
  rewrite (t1);       // <- und hier
  while not eof(f1) do
    begin
      readln (f1,zeile);                                       {liest aus f1 eine Zeile und speichert in "zeile"} 
      write(t1,zeile);                                         {schreibt in t1 den Inhalt von zeile} 
    end;
  close (t1); // <- statt Seek: einfach neu öffnen
  reset (t1);
  read (t1,cDNAgesamt);
  close (f1);
  close (t1);
end;
Gruß
xaromz

...tatsache! so funktioniert's! DAAAAAAANKE


...bin leider grad eben furchtbar aufm schlauch gestanden. :gruebel: Und auch noch ein wenig unerfahren mit delphi. hab das gute teil ja erst seit n paar wochen...


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:44 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