csv in datenbank schreiben per sql befehl
Moderator: Moderatoren
- komma4
- ********
- Beiträge: 5332
- Registriert: Mi, 03.05.2006 23:29
- Wohnort: Chon Buri Thailand Asia
- Kontaktdaten:
Re: csv in datenbank schreiben per sql befehl
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
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
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
-
- ***
- Beiträge: 65
- Registriert: Mo, 14.01.2008 19:31
Re: csv in datenbank schreiben per sql befehl
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...
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...
- komma4
- ********
- Beiträge: 5332
- Registriert: Mi, 03.05.2006 23:29
- Wohnort: Chon Buri Thailand Asia
- Kontaktdaten:
Re: csv in datenbank schreiben per sql befehl
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.
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.
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
- komma4
- ********
- Beiträge: 5332
- Registriert: Mi, 03.05.2006 23:29
- Wohnort: Chon Buri Thailand Asia
- Kontaktdaten:
Re: csv in datenbank schreiben per sql befehl
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!Gabriel123 hat geschrieben:Meine Tabelle hat die Struktur ID(auto),1,2,3,4 und die csv datei 1,2,3,4
Ist wieder von der verwendeten DBMS abhängig.
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
-
- ***
- Beiträge: 65
- Registriert: Mo, 14.01.2008 19:31
Re: csv in datenbank schreiben per sql befehl
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.
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.
-
- ***
- Beiträge: 65
- Registriert: Mo, 14.01.2008 19:31
Re: csv in datenbank schreiben per sql befehl
Ich habe grade im französischen Forum eine gute Anleitung gefunden. Per SQL Befehl kann ich so die daten importieren:
Das habe ich dann ins Makro geschrieben.
Funktioniert soweit ersteinmal.
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"
Funktioniert soweit ersteinmal.
- komma4
- ********
- Beiträge: 5332
- Registriert: Mi, 03.05.2006 23:29
- Wohnort: Chon Buri Thailand Asia
- Kontaktdaten:
Re: csv in datenbank schreiben per sql befehl
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?
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?
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
-
- ***
- Beiträge: 65
- Registriert: Mo, 14.01.2008 19:31
Re: csv in datenbank schreiben per sql befehl
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...
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...
- komma4
- ********
- Beiträge: 5332
- Registriert: Mi, 03.05.2006 23:29
- Wohnort: Chon Buri Thailand Asia
- Kontaktdaten:
Re: csv in datenbank schreiben per sql befehl
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>
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
-
- ***
- Beiträge: 65
- Registriert: Mo, 14.01.2008 19:31
Re: csv in datenbank schreiben per sql befehl
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.
Ich glaube alles was " " ist muss noch "" "" =)
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
- komma4
- ********
- Beiträge: 5332
- Registriert: Mi, 03.05.2006 23:29
- Wohnort: Chon Buri Thailand Asia
- Kontaktdaten:
Re: csv in datenbank schreiben per sql befehl
Du solltest beide Befehle trennen: erst mal die Spalten-ID zurück setzen, dann in einer nächsten Anweisung der Import.
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
-
- ***
- Beiträge: 65
- Registriert: Mo, 14.01.2008 19:31
Re: csv in datenbank schreiben per sql befehl
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...
- komma4
- ********
- Beiträge: 5332
- Registriert: Mi, 03.05.2006 23:29
- Wohnort: Chon Buri Thailand Asia
- Kontaktdaten:
Re: csv in datenbank schreiben per sql befehl
Du vewendest die URL-Schreibweise im SQL ??! Geht das?!
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
-
- ***
- Beiträge: 65
- Registriert: Mo, 14.01.2008 19:31
Re: csv in datenbank schreiben per sql befehl
hm ich denke doch, Für den SQL Befehl LOAD DATA INFILE hattest Du es doch innerhalb des Makros auch genutzt?!komma4 hat geschrieben:Du vewendest die URL-Schreibweise im SQL ??! Geht das?!
- komma4
- ********
- Beiträge: 5332
- Registriert: Mi, 03.05.2006 23:29
- Wohnort: Chon Buri Thailand Asia
- Kontaktdaten:
Re: csv in datenbank schreiben per sql befehl
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?!
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?!
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)