Delphi-PRAXiS
Seite 2 von 5     12 34     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Einfügen über externalTabelle funktioniert nicht richtig (https://www.delphipraxis.net/179327-einfuegen-ueber-externaltabelle-funktioniert-nicht-richtig.html)

Perlsau 27. Feb 2014 13:42

AW: Einfügen über externalTabelle funktioniert nicht richtig
 
Zitat:

Zitat von blutigerAnfänger (Beitrag 1249864)
AAA {43 Leerzeichen} BB {8 Leerzeichen} Spaltentrenner(IBExpert) B {240 Leerzeichen} Zeilenende

Das läßt vermuten – gerade auch, weil die Anzahl der Zeichen ja übereinstimmt (245+5=250 / 240+8+2=250) –, daß im Record in dieser Spalte ein Spaltentrennzeichen vorkommt, das eigentlich noch zum Feldinhalt gehören sollte. Dieses Spaltentrennzeichen wird dann wohl korrekterweise fehlinterpretiert. Wenn du z.B. einen Inhalt hast, in welchem z.B. das ; vorkommt, das aber gleichzeitig Spaltentrennzeichen ist, ist das Chaos vorprogrammiert. Vielleicht könntest du das Spaltentrennzeichen ändern, müßtest das dann aber auch in der Quelldatei machen.

blutigerAnfänger 27. Feb 2014 14:01

AW: Einfügen über externalTabelle funktioniert nicht richtig
 
Code:

AAA  {43 Leerzeichen}   BB {8 Leerzeichen} Spaltentrenner(IBExpert) B {240 Leerzeichen}  Zeilenende

A steht für den zB.Buchstaben aus dem String in Feld 1
B analog
das ist die allererste Zeile der external Tabelle. Es fehlen bereits 2 Buchstaben aus dem String A (Feld 1)

@ Perlsau
Der Gedanke mit dem Trennzeichen ist gut, dennoch wo sollen bei den 2 fehlenden Buchstaben in der allerersten Zeile Trennzeichen herkommen?

In den Vorschriften zur external Datei sollen Dateien mit fester Feldlänge verwendet werden. Genau das habe ich. Was in Feld 2 (mit BB gekennzeichnet) an fehlinterpretierbaren Trennzeichen stehen könnten, sollte durch die FeldGröße (250 Zeichen) aufgefangen werden.

Perlsau 27. Feb 2014 14:12

AW: Einfügen über externalTabelle funktioniert nicht richtig
 
Du hattest oben doch geschrieben:
Code:
AAAAA {45 Leerzeichen}  BBBBB {245 Leerzeichen}  Zeilenende
Das heißt, du hast 5 Zeichen an Information, die mit den 245 Leerzeichen dahinter 250 Zeichen ergeben. Insgesamt hast du hier zwei Spalten.

Nun hast du eine Zeile, in welcher sich plötzlich drei Spalten befinden, wobei die Gesamtanzahl der Länge der letzten beiden Spalten wiederum genau die 250 Zeichen ergeben. Das heißt: irgendwo in dieser Zeile steht ein Spaltentrennzeichen, das dort nicht hingehört, weshalb auch eine dritte Spalte (fehl-)interpretiert wird. Würde dort kein Spaltentrennzeichen stehen, dann würde die Zeile korrekt interpretiert werden.

Zitat:

Zitat von blutigerAnfänger (Beitrag 1249877)
Der Gedanke mit dem Trennzeichen ist gut, dennoch wo sollen bei den 2 fehlenden Buchstaben in der allerersten Zeile Trennzeichen herkommen?

Welche zwei fehlenden Buchstaben? Ich kann dazu nichts sagen, weil mir deine externe Datei nicht vorliegt bzw. weil du den Inhalt der problematischen Zeile nicht bekannt gibst. Das heißt, ich weiß weder, was genau in dieser Zeile steht, noch weiß ich, wie das Trennzeichen (das ja auch aus mehreren Zeichen bestehen kann) aussieht.

Trennzeichen kommen nicht von irgendwo her, sondern befinden sich in deiner externen Datei. Wenn ich derartige Probleme habe, dann untersuche ich die entsprechende Datei ganz genau, am besten via Debugging im Quellcode meines verarbeitenden Programms.

blutigerAnfänger 27. Feb 2014 17:18

AW: Einfügen über externalTabelle funktioniert nicht richtig
 
Liste der Anhänge anzeigen (Anzahl: 2)
@Perlsau
Also in Datei Tabelle2.txt steht meine originale TestTabelle.
In Tabelle2export.txt ist die External Tabelle als Insert statement.(von IBExpert exportiert)
Ich hoffe es hilft dir weiter.
Wo in der exportierten Tabelle allerdings die Kommas herkommen wird wohl ein Geheimnis von Firebird bleiben. Ich vermute mal, daß sollen die ominösen Trennzeichen sein, welche nicht in der Original Datei vorhanden sind.

Perlsau 27. Feb 2014 17:49

AW: Einfügen über externalTabelle funktioniert nicht richtig
 
Zitat:

Zitat von blutigerAnfänger (Beitrag 1249907)
@Perlsau
Also in Datei Tabelle2.txt steht meine originale TestTabelle.
In Tabelle2export.txt ist die External Tabelle als Insert statement.(von IBExpert exportiert)
Ich hoffe es hilft dir weiter.
Wo in der exportierten Tabelle allerdings die Kommas herkommen wird wohl ein Geheimnis von Firebird bleiben. Ich vermute mal, daß sollen die ominösen Trennzeichen sein, welche nicht in der Original Datei vorhanden sind.

Wenn ich mir die originale Tabelle anschaue, komme ich zu dem Schluß, daß es sich um eine ganz normale Textdatei handelt. Die erste Spalte ist immer 50 Zeichen lang, die zweite geht bis zum Linebreak. Da böte es sich doch an, diese Textdatei via Stringliste einzulesen, danach durchzuiterieren und dabei die jeweils ersten 50 Zeichen jedes Items als Inhalt der Spalte 1 (Fremdwort) zu kopieren. Der Rest ist die Beschreibung des Fremdworts (ungetestet, daher ohne Garantie):
Delphi-Quellcode:
Procedure Einlesen;
Var
  MeineListe : TStringList;
  Datei,
  Fremdwort,
  Beschreibung : String;
  i,z : Integer;

Begin
  If not OpenDialog.Execute then exit;
  Datei := OpenDialog.FileName;
  MeineListe := TStringList.Create;

  Try
    MeineListe.LoadFromFile(Datei);
    z := MeineListe.Count;

    If z > 0 then
    For i := 0 to z-1 DO
    Begin
      Beschreibung := Liste[i];
      Fremdwort := Trim(Copy(Beschreibung,1,50);
      Delete(Beschreibung,1,50);

      DatenModul.Dataset.Append;
      DatenModul.Dataset.FieldByName('FREMDWORT').AsString := Fremdwort;
      DatenModul.Dataset.FieldByName('BESCHREIBUNG').AsString := Beschreibung;
      DatenModul.Dataset.Post;
    End;
  Finally
    MeineListe.Free;
  End;

  ShowMessage('Einlesen von "' + Datei + '" beendet ...');
End;
In der Original-Textdatei kommen etliche Kommas vor. Wenn die als Trennzeichen fungieren, kann das natürlich nicht klappen.

Wie hattest du denn mit IbExpert die externe Datei eingebunden?

blutigerAnfänger 27. Feb 2014 18:34

AW: Einfügen über externalTabelle funktioniert nicht richtig
 
Ich benutze IBExpert eigentlich nur um Ergebnisse anzusehen, die von Delphi Quelltext erzeugt wurden.

Nun eine Frage zu deinem Quelltext: Datenmodul?? Steht in den Interbasekomponenten nicht drin.

Offenbar willst du jetzt einen anderen Weg als externalFile einschlagen?

Perlsau 27. Feb 2014 18:48

AW: Einfügen über externalTabelle funktioniert nicht richtig
 
Zitat:

Zitat von blutigerAnfänger (Beitrag 1249918)
Nun eine Frage zu deinem Quelltext: Datenmodul?? Steht in den Interbasekomponenten nicht drin.

Ein Datenmodul ist ein Container für Datenzugriffs-Komponenten. Du kannst ein neues Datenmodul genau so anlegen, wie du z.B. eine neue Form anlegst. Ich verwende das Datenmodul aber auch für die meisten Methoden, die mit dem direkten Datenzugriff zu tun haben. Natürlich mußt du deine Datenzugriffs-Komponenten nicht in einem Datenmodul unterbringen.

Zitat:

Zitat von blutigerAnfänger (Beitrag 1249918)
Offenbar willst du jetzt einen anderen Weg als externalFile einschlagen?

Ich hab keine Ahnung, welchen Weg du gegangen bist, um den Inhalt der Textdatei in deine Firebird-Datenbank zu bekommen, doch ganz offensichtlich war diese Methode fehlerhaft. Daher habe ich dir eine ganz einfache, übersichtliche Vorgehensweise gezeigt. Ob du das übernimmst oder dir was anderes überlegst, bleibt dir überlassen.

Es geht ja offenbar nicht darum, eine externe Datei zur ständigen Verfügung zu haben, wie das z.B. beim Einbinden einer external Table beabsichtigt ist, sondern um das Einlesen von Daten aus einer Textdatei in die Datenbank. Vermutlich willst du dir ein datenbankgestütztes Fremdwörterbuch bauen und dafür bereits vorhandene Fremdwort-Ressourcen verwenden. Das heißt, du willst die Inhalte nur einmal einlesen, danach benötigst du diese Textdatei nicht mehr. Anders wäre es, wenn du das ExternalFile benötigen würdest, weil irgend eine andere Anwendung diese External Table ständig aktualisiert. Bei External Table werden, soweit ich das verstanden habe, keine Kopien der Inhalte in der Datenbank angelegt, sondern das ExternalFile direkt als Speicher verwendet. Du aber möchtest die Daten der Textdatei in deiner Datenbank-Tabelle verfügbar haben.

Übrigens fehlt in meiner Methode noch eine Prüfung, ob das aktuell einzufügende Fremdwort bereits in der Datenbank existiert.

blutigerAnfänger 27. Feb 2014 19:22

AW: Einfügen über externalTabelle funktioniert nicht richtig
 
Zitat:

Zitat von Perlsau (Beitrag 1249921)
Ein Datenmodul ist ein Container für Datenzugriffs-Komponenten. Du kannst ein neues Datenmodul genau so anlegen, wie du z.B. eine neue Form anlegst. Ich verwende das Datenmodul aber auch für die meisten Methoden, die mit dem direkten Datenzugriff zu tun haben. Natürlich mußt du deine Datenzugriffs-Komponenten nicht in einem Datenmodul unterbringen.

Damit werde ich mich erst einmal eine Weile beschäftigen müssen.

Zitat:

Zitat von Perlsau (Beitrag 1249921)

Es geht ja offenbar nicht darum, eine externe Datei zur ständigen Verfügung zu haben, wie das z.B. beim Einbinden einer external Table beabsichtigt ist, sondern um das Einlesen von Daten aus einer Textdatei in die Datenbank. Vermutlich willst du dir ein datenbankgestütztes Fremdwörterbuch bauen und dafür bereits vorhandene Fremdwort-Ressourcen verwenden. Das heißt, du willst die Inhalte nur einmal einlesen, danach benötigst du diese Textdatei nicht mehr. Anders wäre es, wenn du das ExternalFile benötigen würdest, weil irgend eine andere Anwendung diese External Table ständig aktualisiert. Bei External Table werden, soweit ich das verstanden habe, keine Kopien der Inhalte in der Datenbank angelegt, sondern das ExternalFile direkt als Speicher verwendet. Du aber möchtest die Daten der Textdatei in deiner Datenbank-Tabelle verfügbar haben.

Wenn ich dich richtig verstanden habe, unterliegst du offenbar einem Irrtum. Es geht nicht darum, eine externe Datei zur ständigen Verfügung zu haben, sondern um das schnelle Einlesen von Daten (vielleicht ist Bulk Insert dazu das richtige Stichwort). Im Rahmen meiner Recherche habe ich irgendwo gelesen, daß die Orignale Textdatei(mit fixer Datensatzlänge) sozusagen als Block in die ExterneFirebirdTabelle übernommen wird. Daraufhin wird diese ExterneFirebirdTabelle in eine interne Tabelle verwandelt und die externe gelöscht.
Kurz gesagt es ist ein schnellerer Datenimport als das Einlesen jedes einzelnen Datensatzes per Insert...value...

Perlsau 27. Feb 2014 19:41

AW: Einfügen über externalTabelle funktioniert nicht richtig
 
Zitat:

Zitat von blutigerAnfänger (Beitrag 1249927)
Zitat:

Zitat von Perlsau (Beitrag 1249921)
Es geht ja offenbar nicht darum, eine externe Datei zur ständigen Verfügung zu haben, wie das z.B. beim Einbinden einer external Table beabsichtigt ist, sondern um das Einlesen von Daten aus einer Textdatei in die Datenbank. Vermutlich willst du dir ein datenbankgestütztes Fremdwörterbuch bauen und dafür bereits vorhandene Fremdwort-Ressourcen verwenden. Das heißt, du willst die Inhalte nur einmal einlesen, danach benötigst du diese Textdatei nicht mehr. Anders wäre es, wenn du das ExternalFile benötigen würdest, weil irgend eine andere Anwendung diese External Table ständig aktualisiert. Bei External Table werden, soweit ich das verstanden habe, keine Kopien der Inhalte in der Datenbank angelegt, sondern das ExternalFile direkt als Speicher verwendet. Du aber möchtest die Daten der Textdatei in deiner Datenbank-Tabelle verfügbar haben.

Wenn ich dich richtig verstanden habe, unterliegst du offenbar einem Irrtum. Es geht nicht darum, eine externe Datei zur ständigen Verfügung zu haben, sondern um das schnelle Einlesen von Daten (vielleicht ist Bulk Insert dazu das richtige Stichwort).

Aber genau das schrieb ich oben doch! Der Grund, eine External Table einzubinden, kann nur der sein, eine externe Datei zur ständigen Verfügung zu haben. Mit deinem Hinweis im ersten Post plus der Bemerkung von mkinzler ist bei mir erstmal dieser Eindruck entstanden. Dann habe ich realisiert, daß es dir lediglich "um das Einlesen von Daten aus einer Textdatei in die Datenbank" geht.

Bulk Insert bedeutet nichts anderes, als die Daten in einem Rutsch einzulesen. Das kannst du z.B. auch mit IbExpert machen, wenn du aus den Quelldaten zuvor eine entsprechende SQL-Datei erzeugst.

Delphi-Quellcode:
MeineListe[i] := "insert into Fremdworttabelle (Fremdwort, Beschreibung) values (' + QuotedStr(Fremdwort) + ',' + QuotedStr(Beschreibung) + ');
Und am Ende vor dem Freigeben der Liste:
Delphi-Quellcode:
MeineListe.SaveToFile(Datei + '.sql');
Am Ende hast du eine Textdatei, die du direkt in IbExpert via Sql-Script einlesen kannst.

Kurz: Es gibt viele Wege, um diese Daten in die Datenbank zu bekommen. Einen davon hab ich dir gezeigt.

Zitat:

Zitat von blutigerAnfänger (Beitrag 1249927)
Im Rahmen meiner Recherche habe ich irgendwo gelesen, daß die Orignale Textdatei(mit fixer Datensatzlänge) sozusagen als Block in die ExterneFirebirdTabelle übernommen wird. Daraufhin wird diese ExterneFirebirdTabelle in eine interne Tabelle verwandelt und die externe gelöscht.
Kurz gesagt es ist ein schnellerer Datenimport als das Einlesen jedes einzelnen Datensatzes per Insert...value...

Kannst du mir diese Quelle zeigen, in der beschrieben wird, wie man eine reine Textdatei ohne SQL-Befehle in die Datenbank einliest? Davon hab ich bis heute nämlich noch nie was gehört oder gelesen. Mit External Table hat das, soweit ich das beurteilen kann, aber erstmal nichts zu tun.

Könntest du vielleicht noch mitteilen, wieviele Datensätze insgesamt eingelesen werden sollen? Wenn es wirklich nur ein paar (tausend) sind, dann ist Bulk Insert quasi überdimensioniert. Meine oben gezeigte Methode würde dann vollkommen ausreichen. Bulk Insert hat zudem den Nachteil, daß du nicht ohne weiteres prüfen kannst, ob ein entsprechender Datensatz bereits existiert.

blutigerAnfänger 27. Feb 2014 20:50

AW: Einfügen über externalTabelle funktioniert nicht richtig
 
@Perlsau
Also ich kann dir leider keine Quelle zeigen, dennoch bin ich mir sicher ähnliches gelesen zu haben.(Altersstarrsinn??)
Ansonsten habe ich ja jetzt Material für ein paar Tage. Gute Nacht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:48 Uhr.
Seite 2 von 5     12 34     Letzte »    

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