![]() |
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 |
Re: External File (Import aus Textdatei in SQL-DB)
Zitat:
warum nicht #13#10? Grüsse, Daniel :hi: |
Hi, Daniel B
Zitat:
Gruß ´Hansa |
Hi,
Zitat:
Gruß Hansa |
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 |
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 |
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 |
Hi Lemmy,
Zitat:
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 |
Hi,
Zitat:
Grüße Lemmy |
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 |
Hallo Lemmy,
habe mich jetzt genau (ziemlich) an Dein Tutorial gehalten :
Code:
Der Precompiler meldet mir dann folgenden Fehler :
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;
Code:
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.
Invalid token.
Dynamic SQL Error. SQL error code = -104. Token unknown - line 6, char 1. COMMIT. Gruß Hansa |
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:
tutet ohne Probleme. Meine Inserts:
CREATE TABLE EXPdata EXTERNAL FILE 'D:\EXPdata.txt' (
NR char (5), BEZ char (25), CRLF smallint);
Code:
tuten auch, so dass in der Datei dann folgendes steht:
INSERT INTO EXPdata Values(1,'sad',2573);
Code:
:hello:
1 sad
2 sad 3 sad 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:
Die 2573 brauchst Du wie gesagt, dass es ne schöne Liste gibt. :witch:
INSERT INTO EXPdata SELECT nr, bez, 2573 FROM KG8;
|
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 |
Hi,
hier ist gleich schon die Antwort und die Frage auch : Zitat:
Gruß Hansa |
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 |
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 |
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 |
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 |
Hallo Lemmy,
Also lasse ich dieses Script ablaufen, erscheint im Grid der EXTERNAL Table D alles so wie es sein soll :
Code:
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.
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) ); 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:
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 ?
INSERT INTO KUNDE8 SELECT FROM EXTERNAL...;
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