SQLite3 импорт тсв одной строкой - PullRequest
0 голосов
/ 19 февраля 2020

Настройка

Ubuntu 18.04 Google VM

Цель

Я пытаюсь создать для l oop, который будет импортировать различные клиентские файлы данных в соответствующая таблица клиентов.

Проверка запроса. sh

#!/bin/bash

set -eu

date=$(date "+%Y%m%d")

for f in $(find $date*.tsv); do
     client=$(echo $f | sed -Ee 's/.csv.tsv//' -e 's/[0-9]+_stuff_stuff_//')
     sqlite3 mydatabase.db "create table if not exists $client (Date integer, Viewability integer, id1 integer, id2 integer, id3 integer, id4 integer, id5 integer, id6 integer, id7 integer, id8 integer, id9 integer, id10 integer, id11 integer, id12 integer, id13 integer, id14 integer, id15 integer, id16 integer, id17 integer, id18 integer, id19 integer, id20 integer);"
     printf ".mode tsv\n.import $f $client\n" | sqlite3 mydatabase.db
done

Обновленный тест. sh

#!/bin/bash

set -eu

date=$(date "+%Y%m%d")

for f in $date*.tsv; do
    client=$(echo "$f" | sed -Ee 's/.csv.tsv//' -e 's/[0-9]+_stuff_stuff_//')
sqlite3 -batch mydatabase.db
<<EOF
"create table if not exists $client (Date integer, Viewability integer, id1 integer, id2 integer, id3 integer, id4 integer, id5 integer, id6 integer, id7 integer, id8 integer, id9 integer, id10 integer, id11 integer, id12 integer, id13 integer, id14 integer, id15 integer, id16 integer, id17 integer, id18 integer, id19 integer, id20 integer);"
.mode tabs
.import "$f" $client
EOF
done

Ошибка

    expected 22 columns but found 1 - filling the rest with NULL

Из того, что я понял, sqlite3 не обрабатывает новые строки так же, как мой первоначальный запрос выглядел так, чтобы все выполнялось в одной строке с каждой командой, следующей за другой, или с ";" разделители для новых строк. Исследовав интернет-людей, мы отметили, что чтобы вывести код в одну строку, мне нужно изменить формат на что-то вроде того, что я использовал с преднамеренными перерывами \n. Однако, когда я запускаю код, он, похоже, не читает мои файлы как файл tsv и поэтому находит только 1 столбец. Может ли кто-нибудь подтвердить, что мне не хватает моего кода или неправильного понимания? Я могу только предположить, что это формат, поскольку я могу выполнить импорт вручную без проблем, но я изо всех сил пытаюсь понять, почему новый код не будет принят в этом формате. Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 08 апреля 2020

Использовать -cmd COMMAND (запустить "КОМАНДУ" перед чтением стандартного ввода)

sqlite3 -cmd COMMAND <DBFILE> ".import <TSV_FILE> <TABLE_NAME>"

Пример

Использовать tsv

sqlite3 -cmd ".mode tsv" ...

Создать таблицу

sqlite3 -cmd "CREATE TABLE ..." ...

Итак, для «Query test. sh»:

#!/bin/bash

set -eu

date=$(date "+%Y%m%d")

for f in $(find $date*.tsv); do
     client=$(echo $f | sed -Ee 's/.csv.tsv//' -e 's/[0-9]+_stuff_stuff_//')
     init="create table if not exists $client (Date integer, Viewability integer, id1 integer, id2 integer, id3 integer, id4 integer, id5 integer, id6 integer, id7 integer, id8 integer, id9 integer, id10 integer, id11 integer, id12 integer, id13 integer, id14 integer, id15 integer, id16 integer, id17 integer, id18 integer, id19 integer, id20 integer);"
     sqlite3 -cmd ".mode tsv" -cmd "$init" mydatabase.db ".import $f $clinet"
done
0 голосов
/ 19 февраля 2020

tsv - это не тот режим, который понимает оболочка sqlite3. Чтобы импортировать простой файл с разделителями табуляции в существующую таблицу, вы должны использовать режим tabs :

for f in $date*.tsv; do
    client=$(echo "$f" | sed -Ee 's/.csv.tsv//' -e 's/[0-9]+_stuff_stuff_//')
    sqlite3 -batch mydatabase.db <<EOF
create table if not exists $client (Date integer, Viewability integer, id1 integer, id2 integer, id3 integer, id4 integer, id5 integer, id6 integer, id7 integer, id8 integer, id9 integer, id10 integer, id11 integer, id12 integer, id13 integer, id14 integer, id15 integer, id16 integer, id17 integer, id18 integer, id19 integer, id20 integer);
.mode tabs
.import "$f" $client
EOF
done

(я предпочитаю использовать heredocs, а не передавать результаты 1008 * или echo в оболочку; намного удобнее читать).

В оболочке вы можете использовать .help mode для просмотра доступных режимов:

 sqlite> .help mode
.mode MODE ?TABLE?       Set output mode
   MODE is one of:
     ascii    Columns/rows delimited by 0x1F and 0x1E
     csv      Comma-separated values
     column   Left-aligned columns.  (See .width)
     html     HTML <table> code
     insert   SQL insert statements for TABLE
     line     One value per line
     list     Values delimited by "|"
     quote    Escape answers as for SQL
     tabs     Tab-separated values
     tcl      TCL list elements
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...