AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein TStringlist wieder mit Trennzeichen speichern
Thema durchsuchen
Ansicht
Themen-Optionen

TStringlist wieder mit Trennzeichen speichern

Ein Thema von zaphood · begonnen am 19. Jan 2020 · letzter Beitrag vom 27. Jan 2020
Antwort Antwort
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#1

AW: TStringlist wieder mit Trennzeichen speichern

  Alt 22. Jan 2020, 08:01
Der Ressourcenschutzblock (try-finaly) fehlt aber immer noch.
Michael
Ein Teil meines Codes würde euch verunsichern.

Geändert von Luckie (22. Jan 2020 um 08:11 Uhr)
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.493 Beiträge
 
Delphi 12 Athens
 
#2

AW: TStringlist wieder mit Trennzeichen speichern

  Alt 22. Jan 2020, 09:13
nicht getestet:
Delphi-Quellcode:
unit CSVHelper;

interface

uses
  Classes, SysUtils;

type
  TStringListCSVHelper = class helper for TStringList
  public
    procedure LoadFromCSVStream(Stream: TStream); overload; virtual;
    procedure LoadFromCSVStream(Stream: TStream; Encoding: TEncoding); overload; virtual;
    procedure LoadFromCSVFile(const FileName: string); overload; virtual;
    procedure LoadFromCSVFile(const FileName: string; Encoding: TEncoding); overload; virtual;
    procedure SaveToCSVStream(Stream: TStream); overload; virtual;
    procedure SaveToCSVStream(Stream: TStream; Encoding: TEncoding); overload; virtual;
    procedure SaveToCSVFile(const FileName: string); overload; virtual;
    procedure SaveToCSVFile(const FileName: string; Encoding: TEncoding); overload; virtual;
  end;

implementation

{TStringListCSVHelper]}

procedure TStringListCSVHelper.LoadFromCSVStream(Stream: TStream);
var
  Buffer: TBytes;
  Encoding: TEncoding;
begin
  Stream.ReadData(Buffer);
  TEncoding.GetBufferEncoding(Buffer, Encoding);
  DelimitedText := Encoding.GetString(Buffer);
end;

procedure TStringListCSVHelper.LoadFromCSVStream(Stream: TStream; Encoding: TEncoding);
var
  Buffer: TBytes;
begin
  Stream.ReadData(Buffer);
  DelimitedText := Encoding.GetString(Buffer);
end;

procedure TStringListCSVHelper.LoadFromCSVFile(const FileName: string);
var
  Stream: TStream;
begin
  Stream := TFileStream.Create(FileName);
  try
    LoadFromCSVStream(Stream);
  finally
    Stream.Free;
  end;
end;

procedure TStringListCSVHelper.LoadFromCSVFile(const FileName: string; Encoding: TEncoding);
var
  Stream: TStream;
begin
  Stream := TFileStream.Create(FileName, fmOpenRead);
  try
    LoadFromCSVStream(Stream, Encoding);
  finally
    Stream.Free;
  end;
end;

procedure TStringListCSVHelper.SaveToCSVStream(Stream: TStream);
begin
  SaveToCSVStream(Stream, Encoding);
end;

procedure TStringListCSVHelper.SaveToCSVStream(Stream: TStream; Encoding: TEncoding);
var
  Buffer: TBytes;
begin
  Buffer := Encoding.GetBytes(DelimitedText);
  Stream.WriteData(Buffer);
end;

procedure TStringListCSVHelper.SaveToCSVFile(const FileName: string);
var
  Stream: TStream;
begin
  Stream := TFileStream.Create(FileName, fmOpenWrite);
  try
    SaveToCSVStream(Stream);
  finally
    Stream.Free;
  end;
end;

procedure TStringListCSVHelper.SaveToCSVFile(const FileName: string; Encoding: TEncoding);
var
  Stream: TStream;
begin
  Stream := TFileStream.Create(FileName, fmOpenWrite);
  try
    SaveToCSVStream(Stream, Encoding);
  finally
    Stream.Free;
  end;
end;

end.
Delphi-Quellcode:
uses
  CSVHelper;
  
function BuildFilename(DateTime: TDateTime): string;
begin
  Result := 'BDECN ' + FormatDateTime('yyyy_mm_dd__hh_mm_ss', DateTime) + '.dat';
end;

procedure SaveData(MyCSV: TStringList);
begin
  MyCSV.Delimiter := ';';
  MyCSV.StrictDelimiter := True;
  MyCSV.SaveToCSVFile(BuildFilename(Now));
end;

procedure LoadData(MyCSV: TStringList);
begin
  MyCSV.Delimiter := ';';
  MyCSV.StrictDelimiter := True;
  MyCSV.LoadFromCSVFile(BuildFilename(Now));
end;

Geändert von Blup (22. Jan 2020 um 09:17 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

AW: TStringlist wieder mit Trennzeichen speichern

  Alt 22. Jan 2020, 10:53
In wie fern löst das sein Problem?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
einbeliebigername

Registriert seit: 24. Aug 2004
140 Beiträge
 
Delphi XE8 Professional
 
#4

AW: TStringlist wieder mit Trennzeichen speichern

  Alt 22. Jan 2020, 11:21
Hallo,

man kann das auch komplizierter machen als es ist.
Delphi-Quellcode:
program Dp203164Project1;
{$APPTYPE CONSOLE}
uses
  System.SysUtils,
  System.Classes;
var
  vSl: TStringList;
  vI: Integer;
begin
  vSl:= TStringList.Create;
  try
    vSl.LineBreak:= ';';
    vSl.LoadFromFile('Test1.txt');
    Writeln('vSl.Count: '+ vSl.Count.ToString);
    for vI:= 0 to vSl.Count- 1 do
      Writeln('vSl['+ vI.ToString+ ']: '+ vSl[vI]);
    vSl.delete(2);
    vSl.delete(3);
    vSl.Move(1,0);
    vSl.insert(1,'10');
    vSl.Move(3,2);
    vSl.insert(3,'1');
    vSl.insert(4,'1');
    vSl.insert(5,' ');
    vSl.SaveToFile('Test2.txt');
  finally
    vSl.Free;
  end;
  Readln;
end.
Mit dem Inhalt
Code:
0193433020;2301000953;CNC-DB;3302060000;drehen01;300;;;;
ohne Enter in Test1.txt gibt es die Ausgabe:
Code:
vSl.Count: 9
vSl[0]: 0193433020
vSl[1]: 2301000953
vSl[2]: CNC-DB
vSl[3]: 3302060000
vSl[4]: drehen01
vSl[5]: 300
vSl[6]:
vSl[7]:
vSl[8]:
und den Inhalt
Code:
2301000953;10;3302060000;1;1; ;0193433020;300;;;;
ohne Enter in Test2.txt. Noch nicht ganz was der TE will. Das liegt aber an:
Delphi-Quellcode:
    vSl.delete(2);
    vSl.delete(3);
    vSl.Move(1,0);
    vSl.insert(1,'10');
    vSl.Move(3,2);
    vSl.insert(3,'1');
    vSl.insert(4,'1');
    vSl.insert(5,' ');
Mit freundlichen Grüßen, einbeliebigername.
  Mit Zitat antworten Zitat
zaphood

Registriert seit: 19. Jan 2020
Ort: Hattingen
11 Beiträge
 
FreePascal / Lazarus
 
#5

AW: TStringlist wieder mit Trennzeichen speichern

  Alt 22. Jan 2020, 12:53
@einbeliebigername:
bei Writeln('vSl.Count: '+ vSl.Count.ToString) steigt mein Lazarus aus mit einem Fehler.

@Klaus01:
Ja genau ich möchte gerne mit den einzelnen Zeilen arbeiten(z.B. Messstation := sl.Strings[2])
Damit ich die mit if abfragen kann und sehr leicht wieder zusammensetzen kann wie ich den String benötige.
Leider komme ich mit Deinem Tipp mit der zweiten Stringlist nicht weiter.
Bei der Zuweisung des Index0 mit slZeile[0]... hänge ich.
Dirk
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

AW: TStringlist wieder mit Trennzeichen speichern

  Alt 22. Jan 2020, 13:16
@einbeliebigername:
bei Writeln('vSl.Count: '+ vSl.Count.ToString) steigt mein Lazarus aus mit einem Fehler.
Und welchem?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.784 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: TStringlist wieder mit Trennzeichen speichern

  Alt 22. Jan 2020, 13:22
was meinst Du mit hängt?

Mit der Routine bekomme ich alle Spalteneinträge im Memo angezeigt.

Delphi-Quellcode:
var
  sl: TStringList;
  slZeile: TStringList;
  zeile,spalte: Integer;
begin
 sl := TStringList.Create;
 try
   sl.LoadFromFile('e:\test.txt');
   for zeile:=0 to sl.Count -1 do
     begin
       slZeile := TStringList.Create;
       try
         slZeile.Delimiter := ';';
         slZeile.DelimitedText := sl[zeile];
         for spalte := 0 to slZeile.Count -1 do
           if slZeile[spalte] = 'then
             memo1.Lines.Add('----')
           else
             memo1.Lines.Add(slZeile[spalte]);
       finally
         slZeile.Free;
       end;
     end;
 finally
   sl.Free;
 end;
end;
Im Memo steht dann:
Code:
0193433020
2301000953
CNC-DB
3302060000
drehen01
300
----
----
----
----
Die Datei besteht aus der Zeile:
Code:
0193433020;2301000953;CNC-DB;3302060000;drehen01;300;;;;
Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:23 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