Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TStringlist splitten, neues problem (https://www.delphipraxis.net/24192-tstringlist-splitten-neues-problem.html)

Michael80 17. Jun 2004 07:04


TStringlist splitten, neues problem
 
Hallo leute,

ich lade mir ein txt file in eine TStringList, und will diese werte dann in einer datenbank speichern. Die einzelnen Spalten sind durch ; getrennt

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var TempList: TStrings;
begin
    Templist := TStringlist.Create;
    with Templist do begin
    loadfromFile('C:\Datei.TXT');
    try
    finally
    Templist.free;
    end;
    end;
    end;
end.
mir fehlt jetz irgendwie ein ansatz wie ich die einzelnen Zeilen durchlaufe und nach dem ;
aufteile :wiejetzt: die ergebnisse werden dann mit

Delphi-Quellcode:
insert into TABLE(FELD1, FELD2) VALUES ('wert1','wert2')
hoffentlich in die datenbank gespeichert.


Ich hoff ihr verzeiht mir, aber ich bin neu in Delphi und grad am lernen.


Gruß

Michael

Sharky 17. Jun 2004 07:37

Re: TStringlist nach ; splitten und in Interbase Speichern
 
Hai Michael80,

dafür brauchst Du zwei StringListen. Dann kannst Du mit der Eigenschaft DelimitedText arbeiten.
In der ersten sind alle Zeilen aus deiner Datei. Der zweiten wird immer eine Zeile der ersten übergeben und endhält dann selber für jeden "Eintrag" eine Zeile. Mehr steht in der OH.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  mastersl : TStringList;
  detailsl : TStringList;
  ndx    : Integer; // Laufvariable für Master
begin
  mastersl := TStringList.Create; // Master StringList
  detailsl := TStringList.Create; // Detail StringList
  try
    detailsl.Delimiter := ';';  // Trennzeichen der Einträge pro Zeile
    mastersl.LoadFromFile('deinedatei.csv');
    for ndx := 0 to Pred (mastersl.Count) do
    begin
      detailsl.Clear;
      detailsl.DelimitedText := mastersl.Strings[ndx];
      with Query1 do
      begin
        Close;
        SQL.Text := 'INSERT INTO TABLE(FELD1, FELD2, FELD3) VALUES (:wert1,:wert2,:wert3)';
        ParamCheck := True;
        ParamByName('wert1').AsString := detailsl.Strings[0];
        ParamByName('wert2').AsString := detailsl.Strings[1];
        ParamByName('wert3').AsString := detailsl.Strings[2];
        ExecSQL;
      end;
    end;
  finally
    FreeAndNil (mastersl);
    FreeAndNil (detailsl);
  end;
end;

Michael80 17. Jun 2004 07:40

Re: TStringlist nach ; splitten und in Interbase Speichern
 
danke, werd ich sofort probieren! :dp:

---------------------------------------------------------------------

wunderbar, funktioniert einwandfrei :thuimb:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  mastersl : TStringList;
  detailsl : TStringList;
  ndx    : Integer; // Laufvariable für Master
begin
  mastersl := TStringList.Create; // Master StringList
  detailsl := TStringList.Create; // Detail StringList
  try
    detailsl.Delimiter := ',';  // Trennzeichen der Einträge pro Zeile
    mastersl.LoadFromFile('C:\KUNDE.txt');
    for ndx := 0 to Pred (mastersl.Count) do
    begin
      detailsl.Clear;
      detailsl.DelimitedText := mastersl.Strings[0];
      detailsl.savetofile('c:\test.txt');
      {with IBQuery1 do
      begin
        Close;
        SQL.Text := 'INSERT INTO KUNDENSTAMM(KDNR, ANREDE, VORNAME, NACHNAME, ZUSATZ, STRASSE,ORTSTEIL,PLZ,ORT,TELEFON,TELEFAX) VALUES (:wert1,:wert2,:wert3,:wert4,:wert5,:wert6,:wert7,:wert8,:wert9,:wert10,:wert11)';
        ParamCheck := True;
        ParamByName('wert1').AsString := detailsl.Strings[0];
        ParamByName('wert2').AsString := detailsl.Strings[1];
        ParamByName('wert3').AsString := detailsl.Strings[2];
        ParamByName('wert4').AsString := detailsl.Strings[3];
        ParamByName('wert5').AsString := detailsl.Strings[4];
        ParamByName('wert6').AsString := detailsl.Strings[5];
        ParamByName('wert7').AsString := detailsl.Strings[6];
        ParamByName('wert8').AsString := detailsl.Strings[7];
        ParamByName('wert9').AsString := detailsl.Strings[8];
        ParamByName('wert10').AsString := detailsl.Strings[9];
        ParamByName('wert11').AsString := detailsl.Strings[10];
        ExecSQL;
        end;
        IBTransaction1.Commit;}
    end;
  finally
    FreeAndNil (mastersl);
    FreeAndNil (detailsl);
  end;
end;

Michael80 17. Jun 2004 14:25

Re: TStringlist splitten, neues problem
 
zu früh gefreut, jetz hab ich mir meinen kundenstamm aufbereitet und wollte ihn einlesen,
dabei hab ich festgestellt, das er mir in detailsl auch eine neue zeile anfängt, wenn er im
kundenstamm ein leerzeichen findet

sprich er macht aus

meine strasse 1

meine
strasse
1


irgendjemand einen einfall an was das liegt?

Sharky 18. Jun 2004 06:28

Re: TStringlist splitten, neues problem
 
Zitat:

Zitat von Michael80
...sprich er macht aus
meine strasse 1...

Hai Michael80,

in diesem Fall müssen die "Einträge" in der Datei in " eingeschlossen sein (oder ein beliebiges anderes Zeichen).

Zitat:

"dies","ist","ein test","mit","einem blank im text"
Deiner StringListe sagst Du in der Eigenschaft .QuoteChar welches das Zeichen ist. In unserem Beispiel oben also:

Delphi-Quellcode:
  detailsl.Delimiter := ',';  // Trennzeichen der Einträge pro Zeile
  detailsl.QuoteChar := '"';  // Quoting Zeichen.

Michael80 18. Jun 2004 06:51

Re: TStringlist splitten, neues problem
 
das funktioniert aber nicht, weil das system das die daten auswirft, immer diesen aufbau generiert

das heißt ich muss ne funktion schreiben die immer vor und nach dem ; ein " einfügt, und die zeile dann an detailsl übergibt :wall: nu bin ich aber genausoweit wie vorher ...

SirThornberry 18. Jun 2004 06:53

Re: TStringlist splitten, neues problem
 
Oder du versuchst es mal hiermit: http://www.delphipraxis.net/internal...=170554#170554
Aufruf:
Delphi-Quellcode:
splitString(ZuZerlegendeZeile, ',', TDestStringlist);
Beispiel
Delphi-Quellcode:
var LLogList, LSplittedZeile: TStringlist;
    LCount: Integer;
begin
  LLogList := TStringlist.Create;
  LSplittedZeile := TStringlist.Create;
  LLogList.LoadFromFile('c:\yourlog.txt');
  for LCount := 0 to LLogList.Count - 1 do
  begin
    splitString(LLogList.Strings[LCount], ',', LSplittedZeile);
    //Jetzt müsste die Zeile gesplittet in "LSplittedZeile" sein - now do something with it
  end;
  LSplittedZeile.Free;
  LLogList.Free;
end;

Sharky 18. Jun 2004 07:00

Re: TStringlist splitten, neues problem
 
Zitat:

Zitat von Michael80
.... funktion schreiben die immer vor und nach dem ; ein " einfügt, ...

Wenn sichergestellt ist das in der Zeile das ; nur als Trennzeichen vorkommt geht es ja ganz einfach:

Delphi-Quellcode:
  detailsl.DelimitedText := '"' + StringReplace(mastersl.Strings[0],';','";"',[rfReplaceAll]);
[Edit]@SirThornberry: Stelle deine Funktion doch einmal in die CodeLibrary

SirThornberry 18. Jun 2004 07:09

Re: TStringlist splitten, neues problem
 
@Sharky: Hab da noch ne andere Funktion womit man nur einen bestimmten Index bekommt und nicht die ganze gesplittet wird - allerdings muss die funktion noch bissl auf Geschwindigkeit optimiert werden. Wenn diese Funktion fertig ist stell ich dann beide zamm vielleicht in die Codelib. Und letztendlich gehts doch auch über eine TStringlist und StringReplace...

Sharky 18. Jun 2004 07:14

Re: TStringlist splitten, neues problem
 
Zitat:

Zitat von SirThornberry
... Und letztendlich gehts doch auch über eine TStringlist und StringReplace...

Jup! Aber das geht erst seit Delphi 7 (oder schon bei D6?). Deine Funktion ist halt für alle Versionenn möglich ;-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:53 Uhr.
Seite 1 von 2  1 2      

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