Импортируйте файл CSV в базу данных Sqlite3 в командной строке или через пакетный файл - PullRequest
7 голосов
/ 08 августа 2011

Я хотел бы спросить, есть ли какой-либо способ импортировать CSV-файл, содержащий выходные данные моих операторов выбора в SQLite3, в новую базу данных? Ниже приведены коды, которые я сделал до сих пор:

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

Как вы можете видеть, мой первый код состоял в том, чтобы выводить сделанные запросы.

вторая строка кода: я пытаюсь создать новую базу данных и пытаюсь импортировать CSV-файл в таблицу "test"

спасибо за любую помощь, сделанную заранее! : D

Ответы [ 5 ]

8 голосов
/ 08 августа 2011

Я бы порекомендовал сделать ваш импорт из плоского файла, который создаст вашу схему с последующим фактическим импортом:

Вроде так:

sqlite3.exe test.sqlite < import.sql

Где содержимое import.sql:

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

Еще один подход, который вы, возможно, не рассмотрели, - это команда ATTACH . Вы можете присоединить новую базу данных, создать в ней таблицу и импортировать в ее таблицу, чтобы у вас не было лишнего шага экспорта в CSV и повторного анализа. Это может быть запрос CREATE TABLE ... AS SELECT ... или просто INSERT.

Так что, в основном, вы запустите (со своей PHP-страницы):

"ATTACH 'c:\directory\to\database\test.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;"

Или:

"ATTACH 'c:\directory\to\database\test.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;"
1 голос
/ 18 апреля 2014

Для больших файлов CSV может быть более эффективно использовать команду .import оболочки sqlite3, а не анализировать файл в Python и вставлять строки с помощью модуля sqlite3.Это можно сделать с помощью os.system (в Linux, Unix или Mac OS X или Cygwin в Windows):

cmd = '(echo .separator ,; echo .import ' + csv_file + ' ' + table + ')'
cmd += '| sqlite3 ' + db_name
os.system(cmd)
0 голосов
/ 18 января 2018

Однофайловая команда для импорта файла через bash, которая работала для меня:

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

Надеюсь, это поможет.

0 голосов
/ 23 августа 2013

Я включил импорт многих файлов CSV, поэтому я написал следующий скрипт Python, который выполняет работу по созданию и загрузке таблиц sqlite из файлов CSV, используя первую строку CSV в качестве имен полей для таблицы:

#!/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")

Для импорта большого объема данных необходимо реализовать транзакции.

hth

0 голосов
/ 08 августа 2011

Вы можете многое сделать с помощью командной оболочки SQLite и параметров командной строки ... ... но я настоятельно призываю вас найти язык сценариев с поддержкой SQLite, который будет работать в Windows и с которым вам удобно.

Perl и Python - два отличных варианта. Оба поддерживают SqlLite, оба свободно доступны для Windows.

И оба могут справиться с этим - и многие другие виды задач.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...