AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken CSV --> Stringlist --> Stringlist zerlegen --> in DB auft.
Thema durchsuchen
Ansicht
Themen-Optionen

CSV --> Stringlist --> Stringlist zerlegen --> in DB auft.

Ein Thema von Leon de Bar · begonnen am 12. Mär 2006 · letzter Beitrag vom 12. Mär 2006
Antwort Antwort
Seite 3 von 4     123 4      
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#21

Re: CSV --> Stringlist --> Stringlist zerlegen -->

  Alt 12. Mär 2006, 15:10
Ich gehe mal davon aus, dass das Füllen der Tabellen nicht im Mehrbenutzerbetrieb stattfindet. Unter dieser Randbedingung würde ich die drei Lookup-Tabellen in jeweils einer sortierten StringList komplett zwischenspeichern.

Delphi-Quellcode:
var
  slPlz: TStringList;

begin
  slPlz := TStringList.Create;
  with slPlz do
  begin
    Sorted := true;
    Duplicates := dupIgnore;
  end;

  slPlz.Values['74072'] := '1';
  slPlz.Values['60325'] := '2';
  ShowMessage(slPlz.Values['74072']);
end;
marabu
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#22

Re: CSV --> Stringlist --> Stringlist zerlegen -->

  Alt 12. Mär 2006, 15:12
Zitat:
ich bin (wiedermal) Newbie. Das hängt daran, dass ich gezwungen war fast ein Jahr mit Delphi auszusetzen. ;o(
Ich hatte das so verstande, daß du Delphi eigentlich kannst und nur durch die Pause / Verwendung anderer Sparchen nicht mehr "up-to-date" bzw. Delphi mit anderen Sprachen gedanklich vermischt. (Passiert mir auch immer, wenn ich eine Weile mehr php programmiert habe und umgekehrt).

Aus der CSV-datei erhälst du die Klartexte, damit meine ich z.b. sie Straße, und nicht die ID, welche du in die zuerstellende Tabelle einfügen willst. Deshalb mußt du ja eine Abfrage mache, welche dir die dazugehörige ID liefert.
Am besten macht man das mit einer parametrisierten Abfrage. Dies ist eine Abfrage welche einen/mehrere Parameter enthält, welche(n) Wert(e) man später leicht verändern kann ohen die Abfrage neu formullieren zu müssen.

z.B. SELECT PLZ_ID from Tab1 where PLZ = :PLZ; Den Paramter PLZ ( Im Querystring durch das vorangestellte : gesetzt) kannst su in der Schleife dann mit verändern.

AdoQuery.Parameters.ParamByName('PLZ').Value := 'Hauptstraße'; Oder Lösung von marabu verwenden
Markus Kinzler
  Mit Zitat antworten Zitat
Leon de Bar

Registriert seit: 1. Okt 2004
Ort: Berlin
125 Beiträge
 
Delphi 6 Enterprise
 
#23

Re: CSV --> Stringlist --> Stringlist zerlegen -->

  Alt 12. Mär 2006, 15:24
Nein ich hatte vor gut einem jahr angefangen und war schon recht weit mit db-proggen. dann der cut und alles ist weg. ich sitze hier in meinem homeoffice umgeben von massen papier aus denen ich mir schnipsel heraussuchen muss oder darf - wie man es nimmt. ich kann programmieren - theoretisch. ich bin in der lage paps und struktugramme zu lesen und diese in einer sprache - wenn ich sie denn kann - umsetzen.

das deprimierende an der sache ist, daß ich euch verstehe nur nicht weiß wie ich und wo ich das einsetzen muss. das beispiel von marabu scheint so zu funktionieren. Berichtigt mich bitte wenn ich falsch liege:

1. nachdem ich - wie bisher meine datei in die Stringliste eingelesen habe, sortiere ich sie nach PLZ? oder sortiere ich sie gleich von vorn herein danach?
2. anschließend ignoriere ich die duplicate?
3. und ich übergebe den PLZ eindeutige ID's?

was ich an dem schnipsel wieder nicht verstehe ist die klartextausgabe (wenn ich das richtig lese) und wie ich es an meinem code anwende, der im grunde von marabu übernommen wurde...???

mir platzt der schädel. ;o/
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#24

Re: CSV --> Stringlist --> Stringlist zerlegen -->

  Alt 12. Mär 2006, 15:34
Zitat:
1. nachdem ich - wie bisher meine datei in die Stringliste eingelesen habe, sortiere ich sie nach PLZ? oder sortiere ich sie gleich von vorn herein danach?
2. anschließend ignoriere ich die duplicate?
3. und ich übergebe den PLZ eindeutige ID's?
Wenn du es wie oben vorgeschlagen machst, hast du ja immere nur eine Zeile in deiner Stringliste.
Du willst also die Tab1,Tab2 usw. auch durch die Werte der CSV-Datei aufbauen.

Dann ist es am besten nach dem aktuellen Wert zu suchen (ob in der Datenbank oder einer Stringliste im Speicher ) wenn gefunden diese ID verwenden, sonst neuen Eintrag erzeugen.

Zitat:
... was ich an dem schnipsel wieder nicht verstehe ist die klartextausgabe (wenn ich das richtig lese) und wie ich es an meinem code anwende, der im grunde von marabu übernommen wurde...???
Unter Klartext meinte ich z,B. "Hauptstraße" währrend in deiner Tabelle nachher eine Zahl steht welche die Hauptstraße kennzeichnet. Mein Code ist als Alternative zu marabu's Code zu sehen wenn Multiuserzugriff oder wenn es sich um eine sehr große Datei handelt, so das zu erwarten ist, das die Stringliste sehr groß wird.
Markus Kinzler
  Mit Zitat antworten Zitat
Leon de Bar

Registriert seit: 1. Okt 2004
Ort: Berlin
125 Beiträge
 
Delphi 6 Enterprise
 
#25

Re: CSV --> Stringlist --> Stringlist zerlegen -->

  Alt 12. Mär 2006, 15:47
oki, ich bastel da mal was. mal sehen wie weit mich das bringt. ;o)

also mir ist es gelungen die daten des StringLists in eine tabelle zu schreiben.

jedoch muss ich ja 4 anfassen. wenn ich mir das aber zusammenklicke, dann kann ich nur eine tabelle der db pro dbgrid anfassen.

wie war es nochmal möglich in einem dbgrid mehrere tabellen zusammen anzuzeigen und diese dann zu bestücken oder im hintergrund diese gesondert anzusprechen?

Mein Hintergrund: ich muss ja die DB ansprechen. das funzt. aber ich muss doch bitte nicht für jede tabelle eine neue ADOTable machen! Ich muss ja mit einem SQL-Statement in 4 verschiedene Tabellen schreiben...
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#26

Re: CSV --> Stringlist --> Stringlist zerlegen -->

  Alt 12. Mär 2006, 15:54
Ich würde nicht mit ADOTable sondern für jede Tabelle ein ADOQuery für das SELECT und eine für den INSERT erstellen, oder wenn natürlich Stringlisten verwenden.

Ich würde nicht über ein Grid auf die Daten zugreifen, sondern direkt auf die DataSet-Kompoenente (ADOTable,ADOQuery usw).

Wenn du nicht weiterkommst kannst du ja mal deine Projekt hier einstellen.
Markus Kinzler
  Mit Zitat antworten Zitat
Leon de Bar

Registriert seit: 1. Okt 2004
Ort: Berlin
125 Beiträge
 
Delphi 6 Enterprise
 
#27

Re: CSV --> Stringlist --> Stringlist zerlegen -->

  Alt 12. Mär 2006, 17:22
Delphi-Quellcode:
        for i := 0 to SL.Count-1 do // ?

        ADOQuery1.



// ADOTable1.Fields[I].AsString := SL.Strings[i]; //?
// ADOTable1.Post; // ?
      end;

Okay. ich streich gleich die segel... Wie mache ich meinem Script an dieser stelle klar, welche SL.Strings[i] er in welche Tabelle in welches Feld zu schreiben hat?

Das schlimme ist ja, ich müsste dann auch noch vergleiche anstellen.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#28

Re: CSV --> Stringlist --> Stringlist zerlegen -->

  Alt 12. Mär 2006, 17:29
Poste mal den ganzen Source, ich habe so das Gefühl wir reden aneinander vorbei
Markus Kinzler
  Mit Zitat antworten Zitat
Leon de Bar

Registriert seit: 1. Okt 2004
Ort: Berlin
125 Beiträge
 
Delphi 6 Enterprise
 
#29

Re: CSV --> Stringlist --> Stringlist zerlegen -->

  Alt 12. Mär 2006, 18:01
Okay, ist aber noch mächtig baustelle hier. Ich weiß nicht wo ich genau ansetzen soll. Also nicht wundern.

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ActnList, ActnMan, ToolWin, ActnCtrls, ActnMenus, StdCtrls,
  Grids, DBGrids, DB, ADODB;

type
  TForm1 = class(TForm)
    ActionMainMenuBar1: TActionMainMenuBar;
    ActionManager1: TActionManager;
    StrassenverzNeu: TAction;
    OpenDialog1: TOpenDialog;
    Memo2: TMemo;
    Edit1: TEdit;
    ADOQuery1: TADOQuery;
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    StringGrid1: TStringGrid;
    procedure StrassenverzNeuExecute(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.StrassenverzNeuExecute(Sender: TObject);
  var
    SL: TStringList;
    SG: TStringGrid;
    i: Integer;
    T: Textfile;
    SInString: String;


begin
  if (OpenDialog1.Execute) then begin
    SL := TStringList.Create; // Objekt erzeugen
    try
      AssignFile(T,OpenDialog1.FileName); // öffnet die Datei
      Reset(T);
      Readln(T, SInString); // Erste Zeile laden
// kann später gelöscht werden
        SInString := StringReplace(SInString, // Ersetze ' ' mit '~~'
         ' ', '~~', [rfReplaceAll, rfIgnoreCase]);
        SL.Delimiter := ';'; // Festlegung des Trennzeichens
      SL.DelimitedText := SInString; // Inhalt der Zeile Schreiben
        SL.Text := StringReplace(Sl.text, // Ersetze '~~' mit ' '
          '~~', ' ', [rfReplaceAll, rfIgnoreCase]);

      Memo2.Lines.Clear; // Löscht das Memo2
      Memo2.Text := SL.Text; // Zeigt erste Zeile in Memo2
// bis hier hin

      while (not Eof(T)) do begin // solange nicht EOF erreicht
        ReadLn(T,SInString); // lies die nächste Zeile
        SInString := StringReplace(SInString, // Ersetze ' ' mit '~~'
         ' ', '~~', [rfReplaceAll, rfIgnoreCase]);
        SL.Delimiter := ';'; // Festlegung des Trennzeichens
        SL.DelimitedText := SInString; // Inhalt der Zeile Schreiben
        SL.Text := StringReplace(Sl.text, // Ersetze '~~' mit ' '
          '~~', ' ', [rfReplaceAll, rfIgnoreCase]);
// kann später gelöscht werden
        Memo2.Lines.AddStrings(SL); // Listet die Felder in Memo2

//******* Tabelle ansprechen *********

// ADOTable1.TableName:='StrVerzeichnis';
// ADOTable1.Active:=true;
// ADOTable1.Append; // ?

// bis hier hin

        for i := 0 to SL.Count-1 do // ?

        ADOQuery1.Insert;
        ADOQuery1.SQL.Text:='INSERT


// ADOTable1.Fields[I].AsString := SL.Strings[i]; //?
// ADOTable1.Post; // ?
end;
finally
i := SL.Count;
ShowMessage(IntToStr(i));
SL.Free; // Objekt schließen
end;
end;
CloseFile(T); // Datei schließen

end;
procedure TForm1.FormCreate(Sender: TObject);
begin

end;

end.

wenn ich nur mit ADOTable arbeite löft es nur werden die daten dann nicht dahin verschoben wo sie sollen, denn es ist ja nur eine Tabelle. Aber mit ADOQuery komm ich gar nicht klar...
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#30

Re: CSV --> Stringlist --> Stringlist zerlegen -->

  Alt 12. Mär 2006, 18:20
Also wenn du unbedingt alles über eine AdoTable arbeiten willst( wie gesagt parametrisierte Queries wären besser) dann mußt du mit Filtern arbeiten.
Schleife über die Felder entfernen.

ADOQuery1.Sql.Text := 'insert into PLZ, Straße, vonHausnr, vonHausnr_zusatz, bisHausnr, bisHausnr-zusatz, GU, Tour) values( :plz, ;str, ;von, ;von_zu, :bis, :bis_zu, :gu ,tour)'; oder in der IDE setzten : Erzeugt einen param. Query

Delphi-Quellcode:
ADOTable1.TableName:='PlzVerzeichnis';
ADOTable1.Filter='plz='''+ SL.Strings[0]+''';
ADOTable1.Filtered := true;
ADOTable1.Open;
AdoQuery1.Parameters.ParamByName(
'plz').value := AdoTable1.FieldByName('plzid').value;

ADOTable1.TableName:=
'StrVerzeichnis';
ADOTable1.Filter=
'strasse='''+ SL.Strings[1]+''';
ADOTable1.Filtered := true;
ADOTable1.Open;
AdoQuery1.Parameters.ParamByName('str').value := := AdoTable1.FieldByName('plzid').value;
 //usw. für weitere Felder

AdoQuery1.ExecSql;
Markus Kinzler
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 4     123 4      


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 08:34 Uhr.
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