windows - Import CSV-fil til Sqlite3 Database i kommandolinje eller via Batch File

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg vil gerne spørge om, hvorvidt der er nogenlunde at importere en csv-fil, der indeholder output af mine udvalgte udsagn i SQLite3 i en ny database?
Følgende er de koder jeg har lavet indtil videre:


sqlite3.exe -csv logsql.sqlite "SELECT local\_port AS port, COUNT(local\_port) AS hitcount FROM connections  WHERE connection\_type = 'accept' GROUP BY local\_port ORDER BY hitcount DESC;" > output.csv
sqlite3.exe -csv test.sqlite "CREATE TABLE test (name varchar(255) not null, blah varchar(255) not null);" .import ./output.csv test


som du kan se min første kode var at dumpe de udførte forespørgsler.


den anden linje af kode jeg forsøger at lave en ny database og forsøg på at importere csv-filen til tabellen 'test'


tak for enhver hjælp på forhånd! : D

Bedste reference


Jeg anbefaler at gøre din import fra en flad fil, som vil oprette dit skema efterfulgt af den faktiske import:


Ligesom:


sqlite3.exe test.sqlite < import.sql


Hvor indholdet af import.sql er:


CREATE TABLE test (name varchar(255) not null, blah varchar(255) not null);
.separator ,
.import output.csv test


En anden tilgang, som du måske ikke har overvejet, er ATTACH-kommandoen. Du kan vedhæfte en ny database, oprette tabellen i den og importere til sin tabel, så du ikke har det ekstra trin at eksportere til CSV og derefter genbruge. Det kan være fra en CREATE TABLE ... SOM VÆLG ... forespørgsel eller bare en INSERT. [13] [14]


Så dybest set du 'd run (fra din PHP side):


"ATTACH 'c:directory	odatabase	est.db' as TESTDB;"
"CREATE TABLE TESTDB.test AS SELECT local\_port AS port, COUNT(local\_port) AS hitcount FROM connections  WHERE connection\_type = 'accept' GROUP BY local\_port ORDER BY hitcount DESC;"


Eller:


"ATTACH 'c:directory	odatabase	est.db' as TESTDB;"
"CREATE TABLE TESTDB.test (name varchar(255) not null, blah varchar(255) not null);"
"IMPORT INTO TESTDB.test SELECT local\_port AS port, COUNT(local\_port) AS hitcount FROM connections  WHERE connection\_type = 'accept' GROUP BY local\_port ORDER BY hitcount DESC;"

Andre referencer 1


For store CSV-filer kan det være mere effektivt at bruge kommandoen sqlite3 shell s .import i stedet for at analysere filen i Python og indsætte rækker med sqlite3 modulet. Det kan gøres via os.system (på Linux, Unix eller Mac OS X eller Cygwin på Windows):


cmd = '(echo .separator ,; echo .import ' + csv\_file + ' ' + table + ')'
cmd += '| sqlite3 ' + db\_name
os.system(cmd)

Andre referencer 2


Du kan gøre meget med SQLite kommando shell og kommandolinje switches ...
... men jeg vil gerne opfordre dig til at finde et SQLite-bevidst skriptsprog, som 'll arbejder på Windows, og at du har det godt med.


Perl og Python er to gode valg. Begge understøtter SqlLite, begge er frit tilgængelige for Windows.


Og begge kan klare dette - og mange andre slags opgaver.

Andre referencer 3


En enkelt-fil kommando til at importere en fil via bash, der fungerede for mig:


sqlite3 inventory.sqlite.db << EOF
delete from audit;
.separator "	"
.import audit-sorted-uniq.tsv audit
EOF


Håber det hjælper.

Andre referencer 4


Jeg nedded at importere mange csv filer, så jeg skrev følgende python script, der gør jobbet med at oprette og indlæse sqlite tabeller fra csv filer, ved hjælp af den første linje i csv som feltnavne for tabellen:


#!/usr/bin/env python
import sqlite3
from csv import DictReader

class SQLiteDB():
    def \_\_init\_\_(self, dbname=':memory:'):
        self.db=sqlite3.connect(dbname)

    def importFromCSV(self, csvfilename, tablename, separator=","):
        with open(csvfilename, 'r') as fh:
            dr = DictReader(fh, delimiter=separator)
            fieldlist=",".join(dr.fieldnames)
            ph=("?,"*len(dr.fieldnames))[:-1]
            self.db.execute("DROP TABLE IF EXISTS \%s"\%tablename)
            self.db.execute("CREATE TABLE \%s(\%s)"\%(tablename, fieldlist))
            ins="insert into \%s (\%s) values (\%s)"\%(tablename, fieldlist, ph)
            for line in dr:
                v=[]
                for k in dr.fieldnames: v.append(line[k])
                self.db.execute(ins, v)
        self.db.commit()

if \_\_name\_\_ == '\_\_main\_\_':
    db=SQLiteDB("mydatabase.sqlite")
    db.importFromCSV("mydata.csv", "mytable")


For at importere en stor mængde data, bør du implementere transaktioner.


HTH