csv in sqlite importieren

Startseite Foren Deutsches LiveCode-Forum csv in sqlite importieren

Schlagwörter: ,

Ansicht von 16 Antwort-Themen
  • Autor
    Beiträge
    • #22488
      foto2004
      Teilnehmer

      Hallo gemeine. wie bringe ich csv Datei in eine SQLite DB rein?

      Eine CSV in ein DataGrid reinzubringen ist ja nicht schwer aber bei der SQLite beißt es bei mir aus.

    • #22490
      Klaus Major
      Verwalter

      Wie gut sind Deine Kenntniss in SQL? 😎

    • #22503
      foto2004
      Teilnehmer

      naja bin jetzt kein Experte aber habe schon Einges mit mySQL und früher mit MS SQL gemacht.

      Ist jetzt nicht so dass ich alles auswendig weiß.

      ich vermute dass ich die CSV in ein Array packen muss und danach Zeile für Zeile in die DB reinschieben muss? Oder?

    • #22504
      foto2004
      Teilnehmer

      ich scheitere genau an der SQL Übergabe:

      on mouseUp
         answer file "Bitte eine CSV-Datei zum Import auswählen" with type "comma Separated Values|csv|CSV"
         if the result = "cancel" then
            exit mouseup
         end if
         
         put it into tFileName
         ## Inhalt der Datei in Variable (tCSV) lesen
         put URL ("file:" & tFileName) into tCSV
         delete line 1 of tCSV
         --replace ";" with tap in tCSV ## egal was ich da umstelle immer meckert er mir das an ...
         put tCSV
         
         
         repeat for each line tLine in tCSV
            put "INSERT INTO ladelist(versandstell,ladenummer,ziel) VALUES(null," & tLine & ")" into tSQL
            revExecuteSQL connID, tSQL  --> EXECUTE SQL
      
            if the result is not empty then 
               answer warning the result
               exit mouseUp
            end if
         end repeat

      meine csv:

      4310;93374;MCSyncro Bratislava s r.o.;80355230;LR00036000;40;640
      4310;93374;;;;40;640
      4310;93362;Leadec Industrial Services Ltd;80355194;JA00021000;20;320
      4310;93362;Leadec Industrial Services Ltd;80355195;JA00021003;18;288
      
    • #22505
      foto2004
      Teilnehmer

      so jetzt geht die Übergabe Abe immer nur die erste Zeile

      global programmPfad, dataPfad, connID, 
      
      on mouseUp
         answer file "Bitte eine CSV-Datei zum Import auswählen" with type "comma Separated Values|csv|CSV"
         if the result = "cancel" then
            exit mouseup
         end if
         
         put it into tFileName
         ## Inhalt der Datei in Variable (tCSV) lesen
         put URL ("file:" & tFileName) into tCSV
         delete line 1 of tCSV
         replace ";" with "' , '" in tCSV
         
         
         sqlCon
         repeat for each line tLine in tCSV
            put "INSERT INTO ladelist(id,versandstelle,ladenummer,ziel) VALUES(null,'" & tLine & "')" into tSQL
            revExecuteSQL connID, tSQL  --> EXECUTE SQL
            
            if the result is not empty then 
               answer warning the result
               exit mouseUp
            end if
         end repeat
         put tCSV
      
      end mouseUp
      

      meine CSV nach dem ersetzen der Trenner:

      4310' , '93374' , 'MCSyncro Bratislava s r.o.
      4310' , '93374' , '
      4310' , '93362' , 'Leadec Industrial Services Ltd
      4310' , '93362' , 'Leadec Industrial Services Ltd
      4310' , '93362' , '
      4310' , '93352' , 'ZENDA Dienstleitungen GmbH
      4310' , '93352' , 'ZENDA Dienstleitungen GmbH
      4310' , '93352' , '
      
    • #22506
      foto2004
      Teilnehmer

      Ich habe es gelöst.
      ich habe einfach das mit dem result aus dem repeat rausgeschmissen.

      ist ja logisch, result bringt immer was daher und somit ist er mir natürlich bei „exit mouseup“ ausgestiegen.

    • #22507
      Klaus Major
      Verwalter

      Moin, moin,

      das hast Du ja geschickt gelöst, Chapeau! 🙂

      Hier noch ein paar Sachen:
      Der zuerst von Dir gewünschte Itemdelimiter heisst -> TAB (von TABulator)
      LC ist hier bei weitem nicht so nachsichtig wie unsere Ohren!
      Bitte achte immer auf den Text im Skripteditor:
      Alle „reservierten“ Keywords (somit auch tab) werden dort eingefärbt und somit
      war dein TAP sicher noch in schwarz zu sehen.

      Deine erste CSV hatte acht Felder pro Zeile, nach Deinem ersetzen der Trenner aber
      nur noch DREI pro Zeile!? Das kann ja nun nicht sein, was hast Du uns verschwiegen? 😀

      Abgesehen von Deiner cleveren Lösung, bräuchten wir aber nichts zu ersetzen, denn wir
      können ja einfach -> set the itemdel to „;“
      und dann mit den einzelnen ITEMS pro Zeile arbeiten.

      Gruß

      Klaus

      P.S.
      Ich habe auch nur rudimentäre SQL Kenntnisse, weiß aber, wo ich bei Bedarf nachsehen kann,
      was ich auch immer mache, wenn ich mit Datenbanken zu tun habe:
      https://www.w3schools.com/sql/default.asp

    • #22509
      foto2004
      Teilnehmer

      Hallo Klaus,

      danke für dein Lob, das geht runter wie Öl 😉

      nun ich habe mit replace gearbeitet weil SQLite unbedingt das so haben möchte ‚text1‘ , ‚text2‘, ‚text3‘

      zumindest funkt es so.

      das ist mein fertiger code:

      on mouseUp
         answer file "Bitte eine CSV-Datei zum Import auswählen" with type "comma Separated Values|csv|CSV"
         if the result = "cancel" then
            exit mouseup
         end if
         
         put it into tFileName
         ## Inhalt der Datei in Variable (tCSV) lesen
         put URL ("file:" & tFileName) into tCSV
         delete line 1 of tCSV
         replace ";" with "' , '" in tCSV
         
         
         sqlCon
         repeat for each line tLine in tCSV
            put "INSERT INTO ladelist(versandstelle,ladenummer,ziel,lief,material,stck,menge) VALUES('" & tLine & "')" into tSQL
            revExecuteSQL connID, tSQL  --> EXECUTE SQL
         end repeat
         if the result <> EMPTY then
            if the result <> 1 then
               answer the result 
            else
               answer "Datensatz eingetragen!"
            end if
         end if
         revCloseDatabase connID
         
      end mouseUp
      

      ach ja das mit den tab – tap naja na hat wieder mal voll der Legastheniker in mir zugeschlagen

      Nur das mit den einzelnen ITEMS pro Zeile verstehe ich jetzt nicht ganz wie du das meinst.

      Grüße aus Bayern

      Immanuel

    • #22510
      Klaus Major
      Verwalter

      Dein erstes CSV:
      4310;93374;MCSyncro Bratislava s r.o.;80355230;LR00036000;40;640
      4310;93374;;;;40;640
      4310;93362;Leadec Industrial Services Ltd;80355194;JA00021000;20;320
      4310;93362;Leadec Industrial Services Ltd;80355195;JA00021003;18;288

      Der Feldtrenner (itemdelimiter) ist hier Semikolon und das ergibt 7 (nicht 8, sorry) items pro Zeile.
      Aber in Deinem letzten Skript hast Du ja alle sieben „Felder“ berücksichtigt.
      In Deinem ersten allerdings nur vier davon -> (id,versandstelle,ladenummer,ziel)

      Das hatte mich etwas stutzig gemacht. 🙂

    • #22512
      foto2004
      Teilnehmer

      ja das habe ich bemerkt dass er mir das anmeckert. aber habs je geändert.

      Ich habe irgendwann mal gelesen wie man das macht eine Tab getrennte Zeile in ein array zu packen kann es aber nicht mer finden

      Möchte natürlich bestimmte Daten wieder suchen und komme soweit dass ich mir eine Zeile rauslesen kann die so aussieht:

      89 4300 93334 Gundlach Graz Automotive Solutions 80355121 BM00297000 1 35

      ist einfach eine SQL ausgabe aber wie bekomme ich diese Zeile in ein Array damit ich einzelne Felder füllen kann.

    • #22513
      Klaus Major
      Verwalter

      Hi Immanuel,

      angenommen, die Reihenfolge der Daten hier:
      89 4300 93334 Gundlach Graz Automotive Solutions 80355121 BM00297000 1 35
      ist identisch mit der Reihenfolge der Felder in der Datenbank:
      versandstelle,ladenummer,ziel,lief,material,stck,menge

      Ich hoffe, die Spalten Deines Datagrids heissen auch so, sonst klappt das hier nicht:

      ...
      ## tData enthält die obengenannten Daten!
      
      ## Wir arbeiten mit REPEAT FOR EACH, daher müssen wir einen 
      ## eigenen Timer zur Party mitbringen
      put 0 into tCounter
      
      put "versandstelle,ladenummer,ziel,lief,material,stck,menge" into dieKeys
      
      ## Siehe unten, daher ist das nötig
      replace "," with TAB in dieKeys
      
      ## Default Feldtrenner:
      set itemdel to TAB
      
      repeat for each item derKey in dieKeys
        add 1 to tCounter
        put item tCounter of tData into tArray[derKey]
      end repeat
      
      ## Falls Du diese Daten an ein bestehendes Datagrid anhängen möchtest:
      ## dispatch "addData" to grp "Dein Datagrid hier" with tArray
      ...

      Gruß

      Klaus

    • #22515
      foto2004
      Teilnehmer

      Danke Klaus,

      habe es gerade selber wieder gefunden. Ich glaube ich mach mal eine Pause, sitze seit 4:00 wieder daran.

      LG Immanuel

    • #22516
      Klaus Major
      Verwalter

      Ich glaube ich mach mal eine Pause, sitze seit 4:00 wieder daran.

      Klingt nach einer guten Idee! 😀

    • #22549
      Axwald
      Teilnehmer

      Hallo,
      zum INSERT: Es ist nicht notwendig (aber elend langsam …) das mit einem ‚repeat‘ zu machen. Nimm einfach das ganze CSV, bringe es in eine passende Form, und schiebe es auf einmal in die Datenbank:

         put fld data_fld into myData
         replace ";" with tab in myData
         set itemdel to tab
         
         repeat for each line L in myData
            put "(" into myLine
            repeat for each item I in L
               put "'" & I & "'" & comma after myLine
            end repeat
            put ")," into char -1 of myLine
            put myLine & CR after myNewVar
         end repeat
         delete char -2 to -1 of myNewVar
         
         put "INSERT INTO ladelist(versandstelle,ladenummer,ziel,lief,material,stck,menge) VALUES " & myNewVar & ";" into tSQL

      Ich habe in ‚fld data_fld‘ die Daten aus Post #22504, und erhalte ein schönes, schnelles, valides SQL-Statement:

      INSERT INTO ladelist(versandstelle,ladenummer,ziel,lief,material,stck,menge) VALUES ('4310','93374','MCSyncro Bratislava s r.o.','80355230','LR00036000','40','640'),
      ('4310','93374','','','','40','640'),
      ('4310','93362','Leadec Industrial Services Ltd','80355194','JA00021000','20','320'),
      ('4310','93362','Leadec Industrial Services Ltd','80355195','JA00021003','18','288');

      Bingo. Viel Spaß!

    • #22551
      Klaus Major
      Verwalter

      Oh, ich hatte keine Ahnung, daß man mehrere Datensätze durch Komma getrennt und wie hier in Klammern bei INSERT INTO als Parameter anfügen kann, das hat mir die w3School verschwiegen! 🙂
      https://www.w3schools.com/sql/sql_insert.asp

      Danke für den Hinweis!

    • #22557
      foto2004
      Teilnehmer

      Danke ich werde es mir mal genauer anschauen. Für diese Anwendung ist es zwar nicht so wichtig dass es sehr performant sein muss aber für andere Projekte macht es doch einen großen Unterschied

      LG Immanuel

    • #22558
      foto2004
      Teilnehmer

      Wow gerade ausprobiert. ist um einiges schneller. Axwald danke für den Tip und dem Codeschnipsel.

      LG Immanuel

Ansicht von 16 Antwort-Themen
  • Du musst angemeldet sein, um auf dieses Thema antworten zu können.