Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi External File (Import aus Textdatei in SQL-DB) (https://www.delphipraxis.net/942-external-file-import-aus-textdatei-sql-db.html)

Hansa 29. Sep 2002 12:43


External File (Import aus Textdatei in SQL-DB)
 
Hallo Leute,

will meine Datenbank mal mit realen DS bestücken. Das kann ich ja, indem ich Daten Zeile für Zeile in eine Textdatei schreibe und diese dann mit CREATE TABLE FROM EXTRENAL 'C:\test' in die SQL-DB einfügen.

Die genaue Syntax steht in Lemmys SQL-Tutorial. Da schreibt er aber, man müsse das CRLF definieren, klar, damit die DB weiß, wo der DS endet, dieses sei unter windows 2573.

Was heißt das, ich soll doch wohl kaum in jede Textzeile am Schluß 2573 hinschreiben? :mrgreen:

Noch eine Frage, kann ich ein Zeichen benutzen um das Ende eines Feldes zu kennzeichnen ? Oder muß ich alles auf die maximale Feldlänge auffüllen ?

Gruß
Hansa

Daniel B 29. Sep 2002 12:52

Re: External File (Import aus Textdatei in SQL-DB)
 
Zitat:

Zitat von Hansa
Was heißt das, ich soll doch wohl kaum in jede Textzeile am Schluß 2573 hinschreiben? :mrgreen:

Hallo Hansa,

warum nicht #13#10?

Grüsse, Daniel :hi:

Hansa 29. Sep 2002 17:37

Hi, Daniel B

Zitat:

warum nicht #13#10?
Natürlich. Aber was im EXTERNAL File hinschreiben, als #13#10 oder wie?

Gruß
´Hansa

Hansa 29. Sep 2002 18:09

Hi,

Zitat:

Noch eine Frage, kann ich ein Zeichen benutzen um das Ende eines Feldes zu kennzeichnen ? Oder muß ich alles auf die maximale Feldlänge auffüllen ?

Schreibe jetzt alles in TXT Datei und gucke, was passiert. Als CRLF verwende ich dann #13#10. :mrgreen:

Gruß
Hansa

Lemmy 29. Sep 2002 22:55

Noi... Kerle hosch net kapiert?? :dancer:

Also die Textdatei sieht so aus:

Name.....Vorname......Straße......Ort......# <-das steht für ein CR!
.
.
.
sich wiederholende Zeilen.

Jetzt definierst Du die External File:

CREATE TABLE External File ...blabla
(NAME CHAR(10),
VORNAME CHAR(10),
Straße CHAR(10),
ORT CHAR(10),
CRLF SmallInt); //Oder Integer, ich weiß es auswendig nicht mehr... *g*

Wenn Du jetzt einlesen willst, kapiert IB noch die Daten anhand der vorgegebenen Struktur zu lesen. Allerdings steht der Cursor am Ende einer Zeile. Du musst dann also um den IB-Cursor in die nächste Zeile zu bringen das CRLF auch "einlesen", ist zwar uninteressant, aber das brauchst Du. Wenn Du Daten AUSLIEST, dann musst Du, um die Daten nicht alle in einer Zeile unterzubringen, das CRLF wieder um in die nächste Zeile zu springen. Dann machst Du eben ein

INSERT INTO EXtFILE VALUES ('NAME','VORNAME','STRASSE','ORT',2573);

Kapische??
Gute Nacht....

Lemmy

Hansa 30. Sep 2002 18:25

Hi Lemmy,

vielen Dank für die Antwort, aber ich habe hier bereits eine Textdatei erzeugt, in der die Daten Zeile für Zeile drinne stehen, genau mit der Feldlänge, die IB erwartet, es geht um Daten-IMPORT. Mir ist aber noch einiges unklar.

Was mache ich eigentlich mit numerischen Werten ? Natürlich habe ich mir gerade eine Kundendatei vorgeknöpft. Außer Skonto ist da kaum numerisches drin. :mrgreen: Vorher fragte ich ja bereits nach dem Feldende-Zeichen. Bei Zahlen ist das aber jetzt absolut notwendig, es sei denn ich könnte in IB sagen, daß er einen String z.B. in einen integer umwandelt. Dann muß ich aber auch wissen wo der string anfängt und aufhört.

Dann kommen ja auch noch die Foreign Keys und die Frage, wie es geht, falls Werte einer externen Tabelle in eine bestehende eingefügt werden sollen. :spin:

Gruß
Hansa

Lemmy 30. Sep 2002 19:29

Hi,

beim Import musst Du in der Tabelle "External File" eben einen Integer bzw. Smallinteger für das Zeilenende angeben.

Das mit dem Feldende ist einfach: bei Char-Werten gibts Du ja an, wie lange das Feld sein soll, bei numerischen Werten (z.B. Numeric (5,2)) ja auch!

Erzeuge doch einfach mal ne External-File mit allen Datentypen (Numeric, Decimal,...) und füge einen Datensatz ein, dann weißt Du, wieviel Platz di in dem File brauchen. Stimmt Dein gegebenes File mit den Daten mit diesem File überein, dann kannst Du das Ding einlesen, anderenfalls musst Du das halt anpassen....


Grüße
Lemmy

Hansa 30. Sep 2002 19:45

Hi Lemmy,

Zitat:

Erzeuge doch einfach mal ne External-File
Peinlich ! :oops: Da hätte ich auch drauf kommen können.

Bei numerischen Werten vermute ich, daß IB den Teilstring in die entsprechende Zahl umwandelt, wobei dann die nächste Frage ist : Wie wird das Komma behandelt ? :mrgreen: Oje, das Datum brauch ich ja auch noch. Dann hab ich auch noch Arrays und Aufzählungstypen. Uff, aber da muß ich so oder so durch.

Desweiteren stellt sich noch die Hauptfrage, was mache ich mit den ID-Feldern der alten DB????

Gruß
Hansa

Lemmy 1. Okt 2002 09:26

Hi,

Zitat:

Zitat von Hansa
Desweiteren stellt sich noch die Hauptfrage, was mache ich mit den ID-Feldern der alten DB????

Da bleibt Dir nur überig die referentielle Integrität von Hand wieder herzustellen, d.h. beim Einlesen einer Tabelle die mit ner anderen referenziert ist mit einer Select den entsprechenden Datensatz suchen und dessen ID zuweisen....

Grüße
Lemmy

Hansa 1. Okt 2002 10:55

Hallo Lemmy,

Habs befürchtet. Was anderes fällt mir dazu auch nicht ein. Das Hauptproblem ist aber, daß die ID aus der externen table nichts mit der ID von IB zu tun hat. :mrgreen:

Also muß ich doch tatsächlich ein eindeutiges Feld (z.B. Nr) des Stammsatzes in die externe table schreiben und anhand dieses Feldes die zugehörige IB-ID suchen und diese dann in die IB-DB schreiben..... :duck: Da legst di nieda.

Gruß
Hansa

Hansa 1. Okt 2002 12:37

Hallo Lemmy,

habe mich jetzt genau (ziemlich) an Dein Tutorial gehalten :

Code:
CREATE TABLE EXPdata EXTERNAL FILE 'D:\EXPdata.txt' (
    NR  char (5),
    BEZ char (25),
    CRLF smallint);

COMMIT;

INSERT INTO EXPdata SELECT nr,bez FROM KG8;

COMMIT;
Der Precompiler meldet mir dann folgenden Fehler :
Code:
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 6, char 1.
COMMIT.
Die zu exportierende Table besteht nur aus ID,nr und Bez. Die ID lasse ich bewußt raus, siehe oben. Habe das ganze dann noch in A.Koschs Buch durchgelesen, leider nur 1 Seite, da siehts genauso aus, bis auf CRLF CHAR (2). Das wollte ich mal mit deinem Tuto vergleichen, aber jetzt steck ich fest.

Gruß
Hansa

Lemmy 1. Okt 2002 14:46

Hi Hansa,

ich weiß, ich erwähne in jedem meiner Tutos, auch wenns nicht angebracht ist :oops: , wie toll Scripte sind, doch auch ich führe SQL-Statements immer in Blöcken aus, ein Commit benutze ich so gut wie nie, dazu verwende ich die entsprechende IBCOnsole-Funktion.

Die Anweisung
Code:
CREATE TABLE EXPdata EXTERNAL FILE 'D:\EXPdata.txt' (
  NR char (5),
  BEZ char (25),
  CRLF smallint);
tutet ohne Probleme. Meine Inserts:
Code:
INSERT INTO EXPdata Values(1,'sad',2573);
tuten auch, so dass in der Datei dann folgendes steht:

Code:
1    sad                    
2    sad                    
3    sad
:hello:

Dabei beachte man, dass der Text "sad" zusätzlich noch entsprechende Leerstellen hat, um auf 25 Zeichen zu kommen! Wenn Du exportieren willst, sollte folgendes gehen:

Code:
INSERT INTO EXPdata SELECT nr, bez, 2573 FROM KG8;
Die 2573 brauchst Du wie gesagt, dass es ne schöne Liste gibt. :witch:

Hansa 1. Okt 2002 15:11

Hi,

das COMMIT habe ich bei Kosch geklaut, man weiß ja nie. :mrgreen:
Der nimmt außerdem statt 2573 ein CHAR (2), klingt eigentlich logischer.

Gruß Hansa

Ach so : hät ich fast vergessen ! Benutze im Moment IBexpert statt IBconsole, weil es wesentlich mehr Funktionen hat. Bei verschiedenen Scripten gibt es da Unterschiede. Könnte so was sein. Habe diese Frage an die weitergeleitet. :D

Hansa 1. Okt 2002 15:25

Hi,

hier ist gleich schon die Antwort und die Frage auch :

Zitat:

> ich habe hier ein Script aus A.Koschs Buch "Interbase Datenbankentwicklung
> mit Delphi"
>
> CREATE TABLE ANG (
> PERSNR INTEGER NOT NULL,
> NAME VARCHAR(20));
> ALTER TABLE ANG
> ADD CONSTRAINT PK_ANG PRIMARY KEY(PERSNR);
>
> Mit IBexpert bringt er mir Fehlermeldungen, während es mit IBconsole
> einwandfrei durchläuft. Ähnliche Probleme gibt es mit EXTRNAL FILES.

I hope, you are using Script Executive to execute scripts?
If you are using SQL Editor for this you will get an error because SQL
Editor
executes only single statements, not scripts.
Muß leider weg, deshalb ungetestet. Aber eins weiß ich, habe den SQL-Editor benutzt. :mrgreen: Auch ungetestet sage ich deshalb, daß er Recht hat.

Gruß
Hansa

Lemmy 1. Okt 2002 15:45

Hi,

den IBExpert habe ich mir auch schon ein paar mal angeschaut, der gefällt mir aber nicht so. Ich verwende ihn hauptsächlich für Metadatenextraktion...

Grüße
Lemmy

Hansa 1. Okt 2002 16:43

Hi,

so, jetzt hat alles soweit geklappt, d.h. habe jetzt eine textdatei, in der meine 3 Kundengruppen richtig drin stehen. Aber was soll ich damit? Habe hier eine nicht-SQL Kundendatei (2000 Kunden), die habe ich zerpflückt und Satz für Satz in je eine Zeile reingeschrieben, genau wie in meiner DB definiert (also richtige Länge usw.). Sind so ca. 700KB.

Die Daten aus der Textdatei will ich jetzt aber in die DB REIN kriegen nicht raus! Dachte, das sei genau so einfach, so etwa wie

"INSERT FROM ExtTable INTO kunde" oder so.

Über ein solches Konstrukt finde ich aber leider nichts. Heißt das nun, daß es so gar nicht geht und ich die mühsam erstellte, auf die DB angepaßte Textdatei, doch wieder Feld für Feld auseinanderbauen muß, um dann mit Values die Werte rein zu kriegen ?
:bouncing4:

Gruß
Hansa

Lemmy 1. Okt 2002 21:45

Nein, jetzt musst Du mit "Create Table External File" diese Textdatei ansprechen und dabei die richtigen Datentypen sowie die richtigen Größen benutzen. Dann kannst Du mit "Insert into ... Select from External" die Daten in deine DB übernehmen....

Grüße
Lemmy

Hansa 1. Okt 2002 23:55

Hi Lemmy,

Gott sei Dank, das wäre ja ein Witz. Muß morgen alles überprüfen.

:angle: Träume jetzt bald von EXTERNAL,Delphi 7, Interbase........

Gruß
Hansa

Hansa 2. Okt 2002 14:25

Hallo Lemmy,

Also lasse ich dieses Script ablaufen, erscheint im Grid der EXTERNAL Table D alles so wie es sein soll :

Code:
CREATE TABLE D EXTERNAL 'D:\5.0\KUSQL' (
    NR      CHAR(5) NOT NULL,
    ANREDE  STR30,
    NAME    STR30 NOT NULL,
    STRASSE STR30,
    ORT     STR30,
    CRLF    CHAR(2)
);
Das CRLF besteht, wie der Name schon verrät aus CR und LF. Also sind in den Daten-Zeilen der Textdatai zwei Zeichen mehr drin, als Interbase eigentlich braucht. Das Smallint hat in Delphi auch zwei Byte, aber in Interbase ? Mit Smallint oder integer war alles nämlich verschoben.

Aber das ist jetzt egal.

Ich habe jedenfalls jetzt in der DB eine externe Table und muß deren Werte in die "richtige" Interbase-Table reinkriegen.

Code:
INSERT INTO KUNDE8 SELECT FROM EXTERNAL...;
So geht es aber nicht. Da stimmt die Syntax irgendwie nicht. Meistens meckert er direkt nach select. Das größte Problem ist aber, daß die nr aus der Textdatei zwar in die External Table (als CHAR (5)) übernommen wird aber in der richtigen Table ist sie als integer definiert. Wie soll ich denn da den Typ umwandeln ?

Gruß
Hansa
:mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:46 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 by Thomas Breitkreuz