Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Zeilenumbruch CSV (https://www.delphipraxis.net/87369-zeilenumbruch-csv.html)

bennle 27. Feb 2007 17:50


Zeilenumbruch CSV
 
Hallo,
Ich habe wie bereits schon in einem anderen Tread erwähnt eine CSV Datei. (Ich bevorzuge hierfür ein neues Thema, da es sich um etwas gennerelles handelt)

In dieser Datei befinden sich verschiedene Arten von Zeilenumsprünge. Eine Art würde ich gerne entfernen.
Hmm, wie soll ich das nun beschreiben.
Also wenn ich die Datei im TxT-Editor öffne dann sehe ich einmal die Zeilensprünge (normal einfach als Sprung) und dann als Quadrat. Ich gehe davon aus, dass es ein anderer Standart ist und nicht erkannt wird. Aber genau diese möchte ich löschen.
wie kann ich das tun ohne mir die Formatierung zu versauen (also kein Zwangssprung bei 1024 Zeichen)

MfG
Benny

shmia 27. Feb 2007 17:55

Re: Zeilenumbruch CSV
 
Nimm einen Hex-Editor (Forumsuche) und sag uns, welche Zeichen du meinst.
Verlass dich nicht auf die Delphi IDE oder einen 08/15 Editor wie Notepad.
Ein "normaler" Zeilenumbruch (Carriage-Return/Linefeed) ist in der PC-Welt das ASCII-Zeichen $0D gefolgt von $0A.

bennle 27. Feb 2007 18:07

Re: Zeilenumbruch CSV
 
Zitat:

Zitat von shmia
Nimm einen Hex-Editor (Forumsuche) und sag uns, welche Zeichen du meinst.
Verlass dich nicht auf die Delphi IDE oder einen 08/15 Editor wie Notepad.
Ein "normaler" Zeilenumbruch (Carriage-Return/Linefeed) ist in der PC-Welt das ASCII-Zeichen $0D gefolgt von $0A.

Also im Hexeditor wird es als Punkt dargestellt und $0A. Allerdings wird der gewollte Umbruch mit $0D gefolgt von $0A gemacht!

Aber ich bin mir da nicht so sicher!

MfG
Benny

Jürgen Thomas 27. Feb 2007 18:11

Re: Zeilenumbruch CSV
 
Das hätte ich auch direkt vermutet. Eine Möglichkeit wäre, die ganze Datei als Textdatei in einen Editor zu laden und sofort wieder zu speichern; die meisten Editoren verwandeln dabei automatisch LF in CR/LF (und lassen CR/LF unverändert). Das müsstest Du ausprobieren.

Du könntest natürlich auch mit Suchen/Ersetzen arbeiten. Das wird aber eher umständlicher, weil Du nicht so einfach LF entfernen und CR/LF stehen lassen könntest. (Es geht natürlich, aber...)

Jürgen

bennle 27. Feb 2007 18:17

Re: Zeilenumbruch CSV
 
Zitat:

Zitat von Jürgen Thomas
Das hätte ich auch direkt vermutet. Eine Möglichkeit wäre, die ganze Datei als Textdatei in einen Editor zu laden und sofort wieder zu speichern; die meisten Editoren verwandeln dabei automatisch LF in CR/LF (und lassen CR/LF unverändert). Das müsstest Du ausprobieren.

Du könntest natürlich auch mit Suchen/Ersetzen arbeiten. Das wird aber eher umständlicher, weil Du nicht so einfach LF entfernen und CR/LF stehen lassen könntest. (Es geht natürlich, aber...)

Jürgen

Hallo,
Nun verstehe ich nur noch Bahnhof!
Was ist CR und LF und kann ich nicht irgendwie einfach die LF's ohne CR löschen? Denn Ich kann die einzelnden wirklich nicht gebrauchen!

Man ist das kompliziert!

MfG

Benny

bennle 27. Feb 2007 18:24

Re: Zeilenumbruch CSV
 
OK, anders gefragt wie kann ich meine Datei splitten in die CR/LF ?
Also einfach die Daten in Einen String bzw Array. Somit hätte ich ja manuell die Zeile bestimmt und könnte das in ein Memo laden bzw die allein stehenden LF löschen!
Kann mir jemand vielleicht eine Funktion oder so liefern? :thumb:

Gruß
Benny

shmia 27. Feb 2007 18:27

Re: Zeilenumbruch CSV
 
Also gut, wir putzen die Datei mit Delphi.
CleanDatei löscht alle $0A, die kein vorhergehendes $0D haben.
Man könnte auch von die $0A ein $0D einfügen, aber das ist anscheinend nicht gewünscht.
Delphi-Quellcode:
function FileToString(const FileName: string): AnsiString;
var
  fs: TFileStream;
  Len: Integer;
begin
  fs := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
  try
    Len := fs.Size;
    SetLength(Result, Len);
    if Len > 0 then
      fs.ReadBuffer(Result[1], Len);
  finally
    fs.Free;
  end;
end;

procedure StringToFile(const FileName: string; const Contents: AnsiString);
var
  fs: TFileStream;
  Len: Integer;
begin
  fs := TFileStream.Create(FileName, fmCreate);
  try
    Len := Length(Contents);
    if Len > 0 then
      fs.WriteBuffer(Contents[1], Len);
  finally
    fs.Free;
  end;
end;

procedure CleanDatei(const filename:string);
var
   s : string;
   i : integer;
begin
   s := FileToString(filename);
   i := 1;
   while i <= length(s) do
   begin
      // Wenn aktuelles Zeichen eine Linefeed ist
      // aber der Vorgänger kein Carriage-Return war
      if (s[i] = #$0A) and (i=1 or ((i>1) and (s[i-1]<>#$0D))) then
     
         Delete(s, i, 1)  // Zeichen löschen
      else
         Inc(i); // weiter zum nächsten Zeichen
   end;
   RenameFile(filename, filename+'.BAK');
   StringToFile(filename, s);
end;

bennle 27. Feb 2007 18:31

Re: Zeilenumbruch CSV
 
Hi,
Supi ich probiers gleich mal aus! :love:
Nein ich möchte es löschen nicht voranstellen :D

Gruß
Benny

bennle 27. Feb 2007 18:43

Re: Zeilenumbruch CSV
 
Hmm leider ein Fehler in der Zeile:
Delphi-Quellcode:
      if (s[iz] = #$0A) and (iz=1 or ((iz>1) and (s[iz-1]<>#$0D))) then
Meldung: Operator ist auf diesen Operantentyp nicht anwendbar. :(

Und an was liegt es?

Gruß
Benny

Klaus01 27. Feb 2007 18:45

Re: Zeilenumbruch CSV
 
Versuche es einmal so:
Delphi-Quellcode:
if (s[iz] = chr($0A)) and (iz=1 or ((iz>1) and (s[iz-1]<>chr($0D)))) then
Grüße
Klaus


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:47 Uhr.
Seite 1 von 2  1 2      

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