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
        Administrator

          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
                  Administrator

                    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
                      Administrator

                        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
                          Administrator

                            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
                              Administrator

                                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
                                  Administrator

                                    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.