Seite 2 von 3
Re: csv in datenbank schreiben per sql befehl
Verfasst: Mi, 13.02.2008 16:29
von komma4
Die SQL Anweisung LOAD DATA INFILE ist Dein gesuchtes INSERT INTO.
Kannst Du mir Deine CSV-Datei zur Ansicht schicken, dann schau' ich mal (und schreibe mir die Zeile, die den Fehler wirft nochmal dazu). Ich probiere es dann heute abend mal.....
mailto: komma4 (at) gmx.de
Re: csv in datenbank schreiben per sql befehl
Verfasst: Mi, 13.02.2008 16:39
von Gabriel123
Danke, das ist nett aber meine csv-Datei ist die gleiche die du gepostet hast! Entsprechend habe ich auch meine tabelle mit 6 Spalten angelegt ohne ID Spalte. Fehler bleibt nach wie vor unexpected token.
Mit insert into meinte ich so in etwa:
SET TABLE "01" SOURCE "01.txt;ignore_first=false;all_quoted=false"
INSERT INTO "Adressenleer" SELECT * FROM "01";
habe Base 2.3 vielleicht läuft LOAD da einfach nicht...
Re: csv in datenbank schreiben per sql befehl
Verfasst: Mi, 13.02.2008 18:29
von komma4
Sorry Gabriel, ...vielleicht war ich nicht deutlich genug....
Das Beispiel bezieht sich auf
MySQL siehe erstes Posting.
Du fragtest nach "
CSV in DB schreiben": die Fähigkeiten von SQL (und damit auch Basic) sind abhängig von dem verwendeten Treiber und der genutzten DBMS (sollte sich herumgesprochen haben)
Solltest Du eine andere
engine nutzen ist u.U. ein anderes
INSERT statement nötig.
Bei Nutzung der internen HSQLDB habe ich keine
entsprechende Anweisung gefunden!
Ich "arbeite" aber auch nicht mit HSQLDB.
(Für OOo 2.4 sind Programmierschnittstellen zum Im-/Export vorgesehen - die Spezifikation habe ich aber auch noch nicht gelesen).
Bei PostgreSQL nutze ich historischen Gründen eine Schleife und einzelne
INSERT Sätze (in einer Basic-Routine). Damit komme ich auf 500 trx/sec - bei weniger als 1 Mio. Datensätze ausreichend.
Bei Oracle ist es wieder anders... Da komme ich nur mit Basic an die Tabellen, nicht über Base (-Tabellendesign oder -Formulare) [das ist ein Testrechner mit WinXP 2.3.1].
Also, genauer:
wie ist Dein Szenario, welche Daten (-menge?) in welche DB, bitte noch.
Re: csv in datenbank schreiben per sql befehl
Verfasst: Mi, 13.02.2008 18:32
von komma4
Gabriel123 hat geschrieben:Meine Tabelle hat die Struktur ID(auto),1,2,3,4 und die csv datei 1,2,3,4
Das geht auch nur, wenn in einer CSV-Zeile dann ein leeres Feld, oder NULL oder DEFAULT für ein ID / autoincrement Feld mitgegeben wird!
Ist wieder von der verwendeten DBMS abhängig.
Re: csv in datenbank schreiben per sql befehl
Verfasst: Do, 14.02.2008 08:38
von Gabriel123
Wow, also erst einmal herzlichen Dank für deine Geduld und Ausführlichkeit. Welchen DB Engine ich nutze ist eine gute Frage,
ich habe mit Base einfach eine DB angelegt und unter .odb gespeichert. Also denke ich HSQL. Meine Datenmenge ist <5.000 Datensätze. Ich habe von den datenbanken leider noch nicht so den Plan, jetzt auf MYSQL umzusteigen würde mir vermutlich alle bisher programmierten Abfragen unbrauchbar machen.
Mein Szenario sieht so aus: In meiner DB ist eine Tabelle mit Daten+Telefonnummer von Kunden. Die Tabelle wird im Call Center abgearbeitet. Wenn fertig soll der Inhalt der Tabelle gelöscht bzw. exportiert werden (daten wurden verändert) und eine neue liste in die gleiche Tabelle importiert werden. Und das alles über makros. Den Export kann ich zur Not auch manuell über Calc(F4) machen, den Import leider nicht. Wichtig noch: Die DB soll weitergegeben werden können.
Re: csv in datenbank schreiben per sql befehl
Verfasst: Do, 14.02.2008 11:02
von Gabriel123
Ich habe grade im französischen Forum eine gute Anleitung gefunden. Per SQL Befehl kann ich so die daten importieren:
Code: Alles auswählen
CREATE TEXT TABLE "TableCSV" ("ID" INTEGER PRIMARY KEY, "nom" VARCHAR(50),
"prenom" VARCHAR(50))
SET TABLE "TableCSV" SOURCE "01.csv;fs=,"
INSERT INTO "adressenleer" ("ID", "nom", "prenom") SELECT "ID", "nom", "prenom" FROM
"TableCSV"
commit
drop table "TableCSV"
Das habe ich dann ins Makro geschrieben.
Funktioniert soweit ersteinmal.
Re: csv in datenbank schreiben per sql befehl
Verfasst: Do, 14.02.2008 11:27
von komma4
Prächtig (muss ich heute abend auch mal probieren).
Deine BASE-Datei kannst Du natürlich weitergeben. Aber denke daran: die interene HSQLDB wird als Einzelplatzsystem genutzt.
Gabriel123> wird im Call Center abgearbeitet. Wenn fertig soll der Inhalt der Tabelle gelöscht bzw.
Sollte die Aktion des CallCenters nicht auch dokumentiert werden (verschieben des bearbeiteten Datensatzes in eine neue Tabelle, hinzufügen Zeitstempel der Bearbeitung und BearbeiterName)?
Und Du solltest doch in der Lage sein im "laufenden Betrieb" weiterem neue Daten einzukippen, oder? "Sitzt" ihr am gleichen Standort?
Re: csv in datenbank schreiben per sql befehl
Verfasst: Do, 14.02.2008 11:41
von Gabriel123
Danke für den Hinweis, Tabelle1 hat nur Lesezugriff, wenn der Button bearbeiten geklickt wird, wird der aktuelle datesatz in Tabelle2 verschoben und mit allen Änderungen dort gespeichert. Tabelle1 wird nach getaner Arbeit gelöscht und per import mit neuen Daten gefüttert. Tabelle2 wird dann exportiert und ebenfalls gelöscht, dann gehts von vorn los.
im Moment suche ich aber noch einen Weg die ID per Makro zurückzusetzen, denn wenn ich in Tabelle1 nun neue daten importiere läuft die ID weiter...
Re: csv in datenbank schreiben per sql befehl
Verfasst: Do, 14.02.2008 11:57
von komma4
Zum Zurücksetzen der AUTO_INCREMENT Spalte einer Tabelle der internen Datenbank HSQLDB:
Code: Alles auswählen
ALTER TABLE <TABLE_NAME> ALTER COLUMN <COLUMN_NAME> RESTART WITH <NEW_VALUE>
Re: csv in datenbank schreiben per sql befehl
Verfasst: Do, 14.02.2008 15:47
von Gabriel123
Falls Du das mal selbst ausprobierst, vielleicht kannst Du ja mal versuchen 01.csv durch eine Variable zu ersetzen aus einem FileControl Element. das versuche ich grad und es haut nicht hin.
Code: Alles auswählen
DialogLibraries.LoadLibrary("DBImportF4Bib")
Dialog3 = CreateUnoDialog(DialogLibraries.DBImportF4Bib.Dialog3)
Select Case Dialog3.Execute()
Case 1
dlgDateiName=Dialog3.getControl("FileControl1")
Dateiname=dlgDateiName.GetText()
msgbox Dateiname
GlobalScope.BasicLibraries.LoadLibrary( "Tools" )
sCSVdatei = ConvertToURL( Dateiname )
sMyInsert = "ALTER TABLE ""adressenimport"" ALTER COLUMN ""ID"" RESTART WITH 1 CREATE TEXT TABLE ""TableCSV"" (""Kundennr.""VARCHAR(255),""Vorwahl""VARCHAR(255)) SET TABLE ""TableCSV"" SOURCE ""'"& sCSVdatei &"';fs=,;encoding=ISO-8859-1"" INSERT INTO ""adressenimport"" (""Kundennr."",""Vorwahl"") SELECT ""Kundennr."",""Vorwahl"" FROM ""TableCSV"" commit drop table ""TableCSV"""
msgbox sMyInsert
Ich glaube alles was " " ist muss noch "" "" =)
Re: csv in datenbank schreiben per sql befehl
Verfasst: Do, 14.02.2008 16:01
von komma4
Du solltest beide Befehle trennen: erst mal die Spalten-ID zurück setzen, dann in einer nächsten Anweisung der Import.
Re: csv in datenbank schreiben per sql befehl
Verfasst: Do, 14.02.2008 16:23
von Gabriel123
also das Problem ist die Variable und der Pfad. gebe ich den Pfad per msgbox aus steht da c:\tmp\import1.csv dann kommt aber beim import eine fehlermeldung dass auf c:\tmp\c:\tmp\import1.csv nicht zugegriffen werden kann...
Re: csv in datenbank schreiben per sql befehl
Verfasst: Do, 14.02.2008 16:38
von komma4
Du vewendest die URL-Schreibweise im SQL ??! Geht das?!
Re: csv in datenbank schreiben per sql befehl
Verfasst: Do, 14.02.2008 21:28
von Gabriel123
komma4 hat geschrieben:Du vewendest die URL-Schreibweise im SQL ??! Geht das?!
hm ich denke doch, Für den SQL Befehl LOAD DATA INFILE hattest Du es doch innerhalb des Makros auch genutzt?!
Re: csv in datenbank schreiben per sql befehl
Verfasst: Fr, 15.02.2008 00:36
von komma4
Das ConvertToURL wird von der MySQL Syntax in Basic verkraftet!
Ich habe mit dem Beispiel oben einen Import mittels Extras>SQL... innerhalb der base_HSQL.odb hinbekommen, allerdings:
* die EIngabedatei wird im Pfad der ODB erwartet, [eine relative Angabe, oder die URL-Notation wurde mit "not found" quittiert]
* die Umlaute werden (ohne Codierungsangabe!) nicht korrekt importiert,
* ich erhalte eine Fehlermeldung, dass die Spalte "ID" nicht zu finden sei
Da ich die interne Datenbank nicht nutze... kann ich damit leben.
Der erste Punkt dürfte für Dich von Interesse sein?!