[erledigt] CSV nach SQLite überführen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

[erledigt] CSV nach SQLite überführen

Beitrag von scholly »

moin. moin...

Ich hab Probleme, meine alten CSV-Werte in die neue SQLite-DB zu überführen.
CSV enthälte Werte in csvFeld_1 bis csvFeld_12.
In der SQL habe ich mehr Felder (22) definiert, das erste ist ein "INTEGER PRIMARY KEY".

Nun möchte ich folgende Überführung machen:

csv1 bis 7 -> sql1 bis 7
csv9 -> sql8
csv10 -> sql9
csv12 -> sql10

(wie) geht das beim Anlegen eines Datensatzes mit SQliteExecute(DBref, "Insert Into mainTable (csv2sql_felder) Values (csv_felder)") ?

folgender Code erzeut einen "Invalid memory access"-Fehler

Code: Alles auswählen

;   und jetzt aufarbeiten und in die SQL schreiben
    csv2sql_felder ="Titel, Genre, Jahr, MediumTyp, Mediumname, Owner, Quelle, Dauer, Qualität, Infos"
    Debug csv2sql_felder
    Repeat         ; loop as long the 'end of file' isn't reached
    line = ReadString(2) 
    readitem = "'" 
    For k=1 To 12
      Select k
      Case 1
        title  = StringField(line, k, ";"): Readitem = Readitem + title  + "', '"
      Case 2
        genre  = StringField(line, k, ";"): Readitem = Readitem + genre  + "', '"
      Case 3 
        year   = StringField(line, k, ";"): Readitem = Readitem + year   + "', '"
      Case 4
        mtyp   = StringField(line, k, ";"): Readitem = Readitem + mtyp   + "', '"
      Case 5
        mname  = StringField(line, k, ";"): Readitem = Readitem + mname  + "', '"
      Case 6
        owner  = StringField(line, k, ";"): Readitem = Readitem + owner  + "', '"
      Case 7
        src    = StringField(line, k, ";"): Readitem = Readitem + src    + "', '"
      Case 8
        pos    = StringField(line, k, ";"): 
      Case 9
        len    = StringField(line, k, ";"): Readitem = Readitem + len    + "', '"
      Case 10
        status = StringField(line, k, ";"): Readitem = Readitem + status + "', '"
      Case 11
        otitle = StringField(line, k, ";"): 
      Case 12
        playli = StringField(line, k, ";"): Readitem = Readitem + playli +"'"
      EndSelect
    Next
    Debug readitem
    SQliteExecute(DBref, "Insert Into mainTable (csv2sql_felder) Values (Readitem)")
  Until Eof(2)
als DEBUG-Ausgabe erhalte ich nach dem auskommentieren etwas, das IMHO in Ordnung ist (in real mehr Zeilen :)):

Code: Alles auswählen

Titel, Genre, Jahr, MediumTyp, Mediumname, Owner, Quelle, Dauer, Qualität, Infos
'1997 - Ars Electronica - Kakerlakentanz', 'Event', '', 'CD-R', 'movies_110', 'ugs', '', '', '', ''
'2 Jahre Urlaub im All', 'Comic', '', 'CD-R', 'movies_083', 'ugs', '', '', '', ''
'2 wie Feuer und Zunder', 'Eastern', '', 'Tape', 'VCR_1109', 'ugs', 'OVid', '72', 'OV+', ''
'20 Jahre Nena', 'Musik-Doku', '2003', 'CD-R', 'musidoks_117', 'ugs', '', '', '', '--'
'20000 Meilen unter dem Meer', 'Fantasy', '', 'Tape', 'VCR_1087', 'ugs', 'ARD', '127', 'TV+', ''
'2001 - Odyssee im Weltraum', 'Sci-Fi', '', 'Tape', 'VCR_1038', 'ugs', 'OVid', '127', 'OV+', ''
'2004 - Nuhr ein Jahr', 'Comedy', '', 'CD-R', 'movies_263', 'ugs', '', '', '', ''
'2025 - Gejagt durch die Zeit', '_Schrott lohnt nich', '', 'Tape', 'VCR_0000', 'ugs', 'Pro7', '0', 'TVW', ''
'2149 - Kampf in der Todeszone', 'Spiel', '', 'CD-R', 'movies_005', 'ugs', '', '', '', ''
'4 Dinos in New York', 'Urzeit Comic', '', 'Tape', 'VCR_1147', 'ugs', 'Pro7', '61', 'TVS', ''
'976-Evil', '_Schrott lohnt nich', '', 'Tape', 'VCR_0000', 'ugs', 'Pro7', '0', 'TVW', ''
'Aaliyah - MTV Masters', 'Musik-Doku', '2001', 'CD-R', 'musidoks_050', 'ugs', '', '', '', '--'
'ABBA - 30 Jahre (Super Troopers)', 'Musik-Doku', '1111', 'CD-R', 'musidoks_180', 'ugs', '', '', '', '--'
'ABBA - Die Pop-Legende', 'Musik-Doku', '2002', 'CD-R', 'musidoks_060', 'ugs', '', '', '', '--'
hoffentlich hab ich das verständlich genug dargestellt...
scholly
Zuletzt geändert von scholly am 17.05.2008 16:51, insgesamt 1-mal geändert.
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
roherter
Beiträge: 1407
Registriert: 10.04.2005 18:58
Kontaktdaten:

Beitrag von roherter »

Code: Alles auswählen

;-Vor die schleife

If SQLite3_InitLib("sqlite3.dll") = #False
  MessageRequester("SQLite3-Demo", SQLite3_GetLastMessage())
  End
EndIf

 dbHandler=SQLite3_OpenDatabase("-DEINE DATENBANK-")

 sSQL.s = "BEGIN TRANSACTION"
 SQLite3_Execute(sSQL, dbHandler)
;-----

;-Das in deine schleife

 sSQL.s = "Insert Into mainTable ('csv2sql_felder') Values ('Readitem')" 
 SQLite3_Execute(sSQL, dbHandler)

;----

;-Ans Ende
 sSQL = "COMMIT"
 SQLite3_Execute(sSQL, dbHandler)       
 SQLite3_CloseDatabase(dbHandler)
;-------

Ich denke so müsste es gehen,du hast bei Insert Into die -> ' ' vergessen!
Purebasic 5.0 32bit und 64 bit

I'm back from hell
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag von scholly »

roherter hat geschrieben:Ich denke so müsste es gehen, du hast bei Insert Into die -> ' ' vergessen!
AFAIKS ist Dein Code für PBOSL, während ich das Include von TS-soft benutze.
In dessen Beispiel steht nix von wegen TRANSACTION und die Syntax scheint auch anders zu sein.
Ich versuch das mal zu vertsehen und umzusetzen ;)

Ersma danke für den Denkanstoß...
scholly
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag von scholly »

Code: Alles auswählen

SQLiteExecute(DBref, "BEGIN TRANSACTION" )
erzeugt auch einen "Invalid memory access"
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

scholly hat geschrieben:

Code: Alles auswählen

SQLiteExecute(DBref, "BEGIN TRANSACTION" )
erzeugt auch einen "Invalid memory access"
... deutet (wie auch der IMA in Deinem ersten Posting) darauf hin, dass DBref
nicht ein gültiges Handle zu einer zuvor geöffneten Datenbank enthält.

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag von scholly »

Kiffi hat geschrieben:... deutet (wie auch der IMA in Deinem ersten Posting) darauf hin, dass DBref nicht ein gültiges Handle zu einer zuvor geöffneten Datenbank enthält.
Ich hab aber einige Zeilen zuvor damit erfolgreich die DB erstellt:

Code: Alles auswählen

    If SQliteExecute(DBref, "CREATE TABLE maintable (ID INTEGER PRIMARY KEY"+interim+")") = #False
      MessageRequester("Error", SQliteErrorMsg(DBref)) 
      Return
    EndIf
bis denne...
scholly
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

scholly hat geschrieben:Ich hab aber einige Zeilen zuvor damit erfolgreich die DB erstellt:
"einige Zeilen zuvor" bedeutet evtl. innerhalb einer anderen Prozedur?
Oder in der selben Prozedur? (kleine Anspielung auf Global)

Lass Dir doch mal mittels Debug den Wert von DBref ausgeben.

Code: Alles auswählen

Debug DBref
SQLiteExecute(DBref, "BEGIN TRANSACTION" )
Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag von scholly »

moin, moin...
<OT>
Während ich den Fehler am suchen war und anhand der SQLite-Doku versucht habe, mehr über die Syntax zu lernen, hatten wir dummerweise einen 3-stündigen Stromausfall :shock:
Nix kaputtgegangen, aber die Nacht war Schei.., weil ich mich um die diversen Elektrogeräte im Haus kümmern mußte, damits hinterher nicht wieder zu Geräteschrott wegen Überspannung beim Ende des Ausfalls kommt.
<\OT>
Ich hab mich jetzt entschlossen, das CSV nicht in meiner Videoverwaltung als Feature einzubauen (wird eh nur einmal benutzt), sondern von dem Example zu dem Include ausgehend, ein eigenständiges Proggi zu schreiben. Zur Kontrolle hab ich 2 SQLite-Reader gefunden.
Zum einen hoffe ich, auf diesem Weg einen besseren EInstieg zu finden, zum anderen wirds dann einfacher werden, meine Probleme nachzuvollziehen, wenn ich Code poste.

Mit der Syntax-Beschreibung von sqlite.org in Englisch komme ich nicht besonders gut klar - kennt einer von den Mitlesenden irgendwas auf Deutsch im Netz, das mir helfen könnte ?
Ich will ja nicht wegen jedem Pups hier nachfragen, wäre IMHO zu schnell OT.

mDv...
scholly
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

scholly hat geschrieben:kennt einer von den Mitlesenden irgendwas auf Deutsch im Netz, das mir helfen könnte ?
das, was ich so auf Anhieb gefunden habe und auf den ersten Blick hilfreich
sein könnte:

http://de.wikipedia.org/wiki/SQL
http://sql.1keydata.com/de/
http://aam.ugpl.de/?q=node/146
http://www.sql-und-xml.de/sql-tutorial/
http://www.developerchannel.de/sql/sql_uebersicht.php

Wichtig beim Lesen der Tutorials: SQL ist nicht immer gleich SQL. Je nach
Datenbanksystem gibt es unterschiedliche Standards. Microsoft macht da
beispielsweise leider mit seinen Produkten des öfteren einen eigenen
Standard. Wenn Du also in einem Tutorial etwas liest, was mit SQLite nicht
so funktioniert, wie Du es erwartest, dann lies zur Kontrolle noch einmal
auf der SQLite-HP nach, wie SQLite die Parameter / Anweisungen in welcher
Form erwartet.

Und: SQLite unterstützt ein paar Standard-SQL-Anweisungen nicht.
Näheres hier: http://www.sqlite.org/omitted.html
(Ist nichts weltbewegendes, wollte nur darauf hinweisen.)

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag von scholly »

Danke für die Links, Kiffi.

Ich habs auch geschafft, das Example so zu verändern, daß ich nach Ersetzen der definierten Werte durch Einlesen aus meiner .ini und dem .csv wohl die Überführung meiner Daten durchziehen kann.

Es ist aber eine Frage zu diesem Code übriggeblieben:

Code: Alles auswählen

;======================
;   schollys EXAMPLE  
;    csv --> sqlite      
; Original von TS-Soft
;======================

EnableExplicit

XIncludeFile "SQLite3.pbi"

Define.l DBhandle, r, i

; Das repräsentiert das Einlesen meiner echten 21 Spalte aus der Ini-Datei 
Define.s col_name_1   = "spalte1"
Define.s col_name_2   = "spalte2"
Define.s col_name_3   = "spalte3"
Define.s all_sql_cols = col_name_1+", "+col_name_2+", "+col_name_3

; Das repräsentiert das Einlesen meiner Werte im CSV-File
Define.s cvs_val_1    = "hubba"
Define.s cvs_val_2    = "bubba"
Define.s cvs_val_3    = "baloo"
Define.s all_cvs_vals = "'"+cvs_val_1+"', '"+cvs_val_2+"', '"+cvs_val_3+"'"
Debug ""


If SQLiteInit() = 0
  MessageRequester("Error", "Couldn't init SQLite3 lib") : End
EndIf

DBhandle = SQLiteOpen("test.db")
If Not DBhandle
  MessageRequester("Error", SQliteErrorMsg(DBhandle)) : End
EndIf

If SQliteExecute(DBhandle, "CREATE TABLE testtable (ID INTEGER PRIMARY KEY"+", "+all_sql_cols+")") = #False
  Debug SQliteErrorMsg(DBhandle)
EndIf

For r = 1 To 5
  If SQliteExecute(DBhandle, "INSERT INTO testtable ("+all_sql_cols+") VALUES ("+all_cvs_vals+")") = #False
    Debug SQliteErrorMsg(DBhandle)
  EndIf
Next

Define.SQ3_TABLEMAP Table

Table.SQ3_TABLEMAP
SQliteGetTable(DBhandle, "SELECT * FROM testtable", Table)
If Table
  While SQLiteNextRow(Table)
    i + 1 : Debug "_row " + Str(i) + ":"
    While SQLiteNextCol(Table)
      Debug SQLiteValue(Table)
    Wend
  Wend
  ;
  Debug ""
  Debug "Ende der While-Konstruktion"
  Debug ""
  ;
  Debug "_row 1, col 1:"
  SQLiteResetPos(Table)
  SQLiteNextRow(Table)
  SQLiteNextCol(Table)
  Debug SQLiteValue(Table)
  ;
  Debug "_row 2, col 2:"
  SQLiteSelectRow(Table, 2)
  SQLiteSelectCol(Table, 2)
  Debug SQLiteValue(Table)
  ;
  Debug "_row 3, col 3:"
  Debug SQLiteSelectValue(Table, 3, 3)
  ;
  Debug "_row 1, col 3:"
  SQLiteSelectPos(Table, 1, 1)
  Debug SQLiteColValue(Table, SQLiteCols(Table))
  ;
  Debug "_row 2, col 3:"
  Debug SQLiteRowValue(Table, 2)
  ;
  Debug ""
  Debug "_spaltenzahl: " + Str(TABLE\Cols)
  Debug "_satzanzahl : " + Str(TABLE\Rows)
  Debug ""
  ;
  Debug "_spaltennamen:"
  Debug SQLiteColName(Table, 1)
  Debug SQLiteColName(Table, 2)
  Debug SQLiteColName(Table, 3)
  Debug SQLiteColName(Table, 4)
  ;
  ;;;;;;;;;;;;;;;;;;;;;;;
  SQliteFreeTable(Table)
EndIf

SQLiteClose(DBhandle)
SQLiteEnd()
End
Warum funktioniert das ohne "BEGIN TRANSACTION" und "COMMIT", welche roherter ja empfohlen/gefordert hatte ?

mDv... scholly
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Antworten