Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Zeilen in einer Stringlist vervollständigen (https://www.delphipraxis.net/87736-zeilen-einer-stringlist-vervollstaendigen.html)

bofh 5. Mär 2007 13:19


Zeilen in einer Stringlist vervollständigen
 
Hi Leute,
Ich steh gerade voll auf dem Schlauch.
Ich hab eine CSV Datei die ich in eine Stringlist einlese. Nun Möchte ich an jede Zeile in der Stringlist noch was ranhängen.Auserdem muss ich der CSV noch einen Kopf verpassen, also eine erste Zeile.
BSPl.

Kopf:

1;2;3;4;5;6;7

Inhalt:
1bla;blu;hallo;weg -->da muss jetzt noch ;wo;wer;warum rangehängt werden
2bla;blu;hallo;weg -->da muss jetzt noch ;wo;wer;warum rangehängt werden
3bla;blu;hallo;weg -->da muss jetzt noch ;wo;wer;warum rangehängt werden
Kann mir jemand helfen?

mfg
BOFH

IngoD7 5. Mär 2007 13:43

Re: Zeilen in einer Stringlist vervollständigen
 
Eine "Titelzeile" einfügen kannst du mit StringList.Insert.

Einen String am Ende ergänzen kannst du einfach mit Stringlist[x]:=StringList[x]+';wer;wo;warum'.
Das liegt aber doch nahe, oder?

Schleifen in Delphi solltest du beherrschen.

Ansonsten gilt:
Einfach mal alles in der Online-Hilfe zu TStringList durchstöbern. Auf Insert z.B. wärst du dann ganz von alleine gekommen.

smudo 5. Mär 2007 14:46

Re: Zeilen in einer Stringlist vervollständigen
 
Das anfügen weiterer Daten in einer Zeile kannst du auch über den Weg einer zweiten Stringlist machen.
D.h. jede Zeile per DelimitedText in eine zweite Stringliste lesen, Zeilen mit Append, Add oder Insert einfügen und DelimitedText wieder in die Zeile schreiben. Es kommt auf den Umfang des Ganzen an. Und nicht vergessen, den Delimiter auf ';' zu stellen.

René

IngoD7 5. Mär 2007 15:09

Re: Zeilen in einer Stringlist vervollständigen
 
Zitat:

Zitat von smudo
Das anfügen weiterer Daten in einer Zeile kannst du auch über den Weg einer zweiten Stringlist machen.
D.h. jede Zeile per DelimitedText in eine zweite Stringliste lesen, Zeilen mit Append, Add oder Insert einfügen und DelimitedText wieder in die Zeile schreiben. Es kommt auf den Umfang des Ganzen an. Und nicht vergessen, den Delimiter auf ';' zu stellen.

Die DelimitedText-Geschichte interpretiert CSV-Dateien nicht hundertprozentig korrekt!
Ich lasse da immer die Finger von und nutze eigene Routinen, wenn ich CSV-Dateiinhalte aufdröseln muss.

smudo 5. Mär 2007 15:18

Re: Zeilen in einer Stringlist vervollständigen
 
Zitat:

Zitat von IngoD7
...nutze eigene Routinen, wenn ich CSV-Dateiinhalte aufdröseln muss.

Ich meißtens auch - für den Normalfall sollte das Verfahren aber erstmal ausreichen.

IngoD7 5. Mär 2007 15:40

Re: Zeilen in einer Stringlist vervollständigen
 
Zitat:

Zitat von smudo
Zitat:

Zitat von IngoD7
...nutze eigene Routinen, wenn ich CSV-Dateiinhalte aufdröseln muss.

Ich meißtens auch - für den Normalfall sollte das Verfahren aber erstmal ausreichen.

Das sehe ich eigentlich nicht so, da für mich beim Programmieren ein "etwas richtig" nie ausreicht. ;)

Wie es ausschaut muss sein Programm die Zeilen auch gar nicht aufdröseln, sondern lediglich die CSV-Datei erweitern. Daher würde ich zumindest das Delimiter-Risiko ausschließen und es schlicht nicht verwenden.

Ein Beispiel, was gegen Delimiter spricht und mir gerade so auf Anhieb einfällt, ist:
Wenn eine CSV-Datei aus Excel eine Zelle mit Inhalt Eine Zelle mit fünf Wörtern enthält, so macht Delimiter da fünf einzelne Zellen draus, da es - wenn keine Quote-Zeichen beteiligt sind (in Excel das ") - die Leerzeichen (auch) als Zellentrenner ansieht. :!:

smudo 5. Mär 2007 15:53

Re: Zeilen in einer Stringlist vervollständigen
 
CSV ohne Quotes sollte man deshalb auch niemals verwenden. :shock:
Bofh - der ja die eigentliche Frage gestellt hat - hat leider keine weiteren Angaben gemacht. Ich gehe aber aus seiner Fragestellung davon aus, dass er die Inhalte selbst hinzufügt, und nicht aus einem Fremd-Programm importiert. In diesem Fall spricht nichts gegen die Verwendung von DelimitedText. Das ist nicht "etwas richtig", sondern in diesem Falle optimal.

IngoD7 5. Mär 2007 16:50

Re: Zeilen in einer Stringlist vervollständigen
 
Zitat:

Zitat von smudo
CSV ohne Quotes sollte man deshalb auch niemals verwenden. :shock:

Das erzähle dann bitte mal Excel. :wink: Und so steht das z.B. auch nicht in Wikipedia.
Aber bezogen auf Delphi würde ich dir das sofort unterschreiben.

Excel jedenfalls (be)schreibt eine Zelle nur dann in einschließenden Quotes, wenn das Trennzeichen oder das Quotezeichen selbst in der Zelle vorkommt. Leerzeichen nimmt Excel so, wie sie in der Tabelle stehen. Sie sind für Excel einfach nur ein Zeichen ohne weitere Bedeutung - ganz im Gegenteil zu DelimiterText.

Das Problem ist ganz einfach: CSV ist nicht genormt.

Ich behaupte jedoch, dass die meisten CSV-Dateien auf der Welt deshalb existieren, weil es Excel gibt. Die meisten CSV-Dateien werden also von Excel erzeugt oder von ihm eingelesen. Aus diesem Grund empfinde ich den Excel-CSV-Aufbau als Quasi-Standard und richte all mein "CSV-Tun-und-Lassen" darauf hin aus. Daher verbietet sich mir die Benutzung von DelimiterText.

((Anmerkung: Wie Delphi (zumindest D7) das Leerzeichen behandelt, steht in der Hilfe unter TStrings.CommaText. Bei TString.DelimiterText schweigen sie sich dazu leider völlig aus.))

Okay, den "CSV-Neulingen" hier möge unsere kleine Diskussion etwas gebracht haben ... :cheers:

bofh 6. Mär 2007 10:52

Re: Zeilen in einer Stringlist vervollständigen
 
Danke für die Denkanschubser :-)
meine Lösung :coder2:

Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
sl : tstringlist;
kopf :string;
iii: Integer;
begin
  sl := tstringlist.Create;
  kopf := '1;2;3;4;5;6;7';
  sl.LoadFromFile('tmpExcel.csv');
for iii := 0 to sl.Count - 1 do
  begin
    sl[iii] :=sl[iii]+ ';wer;wo;warum';
  end;
    sl.Insert(0,kopf);
    sl.SaveToFile(ExtractFilePath(ParamStr(0))+'Datei.csv');
    Memo4.Lines.LoadFromFile(ExtractFilePath(ParamStr(0))+'Datei.csv');
end;
mfg
BOFH


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