Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Прочие БД - [решено] SQLite3, сделать выборку из большого файла csv

Ответить
Настройки темы
Прочие БД - [решено] SQLite3, сделать выборку из большого файла csv

Старожил


Сообщения: 211
Благодарности: 2

Профиль | Отправить PM | Цитировать


Доброго времени суток! Есть большая таблица csv 1.2ГБ, которая постоянно дополняется данными в конец таблицы. В таблице 52 столбца и уже более 20 миллионов строк. Мне нужно сделать выборку из этой таблицы по списку из AD самых свежих данных, по имени и дате. Я ранее пытался сделать это с помощью powershell и даже сделал, но производительность очень мала и ждать приходится более 8 часов. Мне на этом форуме сразу посоветовали работать с таблицей как с базой данных, я сопротивлялся, но мне прислали еще несколько таблиц больших размеров и мне все же придется научиться работать с базами. Как мне и посоветовали начать с SQLite3. Скачал, распаковал, запустил, создал базу test, импортировал туда свою таблицу. Через sqlitestudio видно, что все названия столбцов импортировались удачно, так же как и данные. В базе есть два столбца, по которым ориентируюсь: Data, System_Unit_Name. Нужно выбрать уникальное значение из System_Unit_Name с самой старшей датой из столбца Data, далее экспортировать всю строку (все 52 столбца) в таблицу или другую базу, чтобы далее работать с ней. Далее уже наверное буду скриптом сравнивать с AD и вылавливать нужные данные. Возможно с базами не так работают, но это мой первый опыт. В идеале я хочу завернуть все в скрипт powershell, чтобы полностью автоматизировать процесс. Проблема в том, что я не могу самостоятельно составить такой запрос. Надеюсь кто-нибудь поможет, ну или вообще я все неправильно придумал и это не осуществимо.

Отправлено: 17:38, 16-09-2021

 

Аватара для El Sanchez

Ветеран


Contributor


Сообщения: 1264
Благодарности: 1024

Профиль | Отправить PM | Цитировать


Цитата Griboed0ff:
Да точно нужна, там в AD 14k имен. »
Griboed0ff, лады:
Код: Выделить весь код
CREATE TABLE IF NOT EXISTS all_pc_result AS
SELECT *
FROM all_pc, AD_list USING(System_Unit_Name)
WHERE Ping <> 'No'
GROUP BY System_Unit_Name HAVING max(printf('%s-%s-%s', substr(Data, length(Data) + 1, -4), substr(Data, instr(Data, '.') + 1, 2), substr(Data, 1, 2)))
Это сообщение посчитали полезным следующие участники:

Отправлено: 18:49, 20-09-2021 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Старожил


Сообщения: 211
Благодарности: 2

Профиль | Отправить PM | Цитировать


Цитата El Sanchez:
лады: »
Отлично, теперь все готово за пару сек, а не как раньше. Только есть проблема с регистром, похоже в запросе имеется чувствительность, а мои списки AD и данные в таблице, могут иметь разные регистры причем даже с половины слова, например, в AD имя RT-3N, в таблице оно же выглядит RT-3n или rt-3n.
Пробовал COLLATE NOCASE, но это работает только для WHERE

Последний раз редактировалось Griboed0ff, 21-09-2021 в 08:00.


Отправлено: 00:19, 21-09-2021 | #12


Старожил


Сообщения: 211
Благодарности: 2

Профиль | Отправить PM | Цитировать


Пока только идея возвести AD_list(System_Unit_Name) и all_pc(System_Unit_Name) в один регистр, а уже потом делать выборки.
Решение:
Код: Выделить весь код
UPDATE all_pc
SET System_Unit_Name = LOWER(System_Unit_Name);

UPDATE AD_list
SET System_Unit_Name = LOWER(System_Unit_Name);

CREATE TABLE IF NOT EXISTS all_pc_result AS
SELECT *
FROM all_pc, AD_list USING(System_Unit_Name)
WHERE Ping <> 'No'
GROUP BY System_Unit_Name HAVING max(printf('%s-%s-%s', substr(Data, length(Data) + 1, -4), substr(Data, instr(Data, '.') + 1, 2), substr(Data, 1, 2)));
Возможно это делается прямо из запроса, но выборка получается полная, значит цель достигнута. Всем спасибо за помощь!
Скрытый текст
Теперь попытаюсь это автоматизировать через PSSQLite (модуль для powershell). Запрашивать нужную аушку, создавать свежий список в ad_list. Далее выборка из таблицы с данными. Далее экспорт таблицы csv. Но обсуждение наверное не для этой ветки форума.

Последний раз редактировалось Griboed0ff, 21-09-2021 в 12:48.


Отправлено: 10:11, 21-09-2021 | #13


Аватара для El Sanchez

Ветеран


Contributor


Сообщения: 1264
Благодарности: 1024

Профиль | Отправить PM | Цитировать


замена Lke
Цитата Griboed0ff:
Пока только идея возвести AD_list(System_Unit_Name) и all_pc(System_Unit_Name) в один регистр, а уже потом делать выборки. »
Griboed0ff, не надо UPDATE, так сделайте:
Код: Выделить весь код
CREATE TABLE IF NOT EXISTS all_pc_result AS
SELECT all_pc.*
FROM all_pc, AD_list
    ON lower(AD_list.System_Unit_Name)=lower(all_pc.System_Unit_Name)
WHERE Ping <> 'No'
GROUP BY AD_list.System_Unit_Name HAVING max(printf('%s-%s-%s', substr(Data, length(Data) + 1, -4), substr(Data, instr(Data, '.') + 1, 2), substr(Data, 1, 2)))

Последний раз редактировалось El Sanchez, 21-09-2021 в 18:40. Причина: замена like(foo, bar) на lower(foo)=lower(bar)

Это сообщение посчитали полезным следующие участники:

Отправлено: 14:22, 21-09-2021 | #14


Старожил


Сообщения: 211
Благодарности: 2

Профиль | Отправить PM | Цитировать


Цитата El Sanchez:
не надо UPDATE, так сделайте: »
Кстати данный метод увеличил время исполнения больше чем в 10 раз.
Оставил вариант с понижением регистра.
Столкнулся с проблемой экспорта таблицы в csv, криво выгружает кириллицу.

Отправлено: 21:16, 21-09-2021 | #15


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата Griboed0ff:
с проблемой экспорта таблицы в csv, криво выгружает кириллицу. »
А именно?

Так-то, в Вашем оригинальном CSV была UTF-8 без BOM.

Отправлено: 16:54, 23-09-2021 | #16


Старожил


Сообщения: 211
Благодарности: 2

Профиль | Отправить PM | Цитировать


Цитата Iska:
А именно? »
именно делаю экспорт
Код: Выделить весь код
sqlite3.exe -header D:\SQlite3\base_test\all_pc_info.db -tabs "select * from all_pc_result" > $outfile
в таблице вижу
Код: Выделить весь код
Майкрософт Windows 10 Pro	64-разрядная
хотя в оригинальной таблице и при просмотре базы вижу нормальные русские буквы на этом же месте.
Цитата Iska:
Так-то, в Вашем оригинальном CSV была UTF-8 без BOM. »
Извините, но это мне ни о чем не говорит. Не понял как мне помогут три байта в начале строки при использовании BOM. Или речь про UTF8 в общем? МБ нужны какие-то действия, чтобы привести таблицу базы в нужную кодировку, которая будет готова к экспорту кириллицы?

Последний раз редактировалось Griboed0ff, 24-09-2021 в 07:24.


Отправлено: 07:14, 24-09-2021 | #17


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата Griboed0ff:
в таблице вижу »
Так это и есть тот же самый UTF-8 без BOM.

Цитата Griboed0ff:
которая будет готова к экспорту кириллицы? »
Кириллица у Вас уже экспортирована.

Чем Вы смотрите Ваш $outfile? Чем смотрели 1.csv, который ранее выкладывали по моей просьбе в соседней теме?

Отправлено: 08:33, 24-09-2021 | #18


Старожил


Сообщения: 211
Благодарности: 2

Профиль | Отправить PM | Цитировать


Цитата Iska:
Чем Вы смотрите Ваш $outfile? Чем смотрели 1.csv, который ранее выкладывали по моей просьбе в соседней теме? »
1.csv открывал через excel там есть кириллица, $outfile это тоже файл csv, открываю тоже excel. Если открывать данные файлы через notepad++, все тоже самое.
То есть кракозябры только после экспорта из базы.

Отправлено: 09:58, 24-09-2021 | #19


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата Griboed0ff:
1.csv открывал через excel там есть кириллица »
Кириллица есть. И у меня под Office 2003 она выглядит точно так же:
Скрытый текст

Ровно так же будет выглядеть и $outfile, если его кодировка будет в UTF-8.

Другое дело, если мы будем делать импорт внешних данных из подобного .csv — там можно указать кодировку исходного файла:
Скрытый текст

и тогда кириллица будет нормально отображаться.

Что касается Notepad++ — убедитесь, что выбрана правильная кодировка файла:
Скрытый текст

Отправлено: 06:37, 25-09-2021 | #20



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Прочие БД - [решено] SQLite3, сделать выборку из большого файла csv

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
PowerShell - Создание переменчивой переменной из csv файла Dillaname Скриптовые языки администрирования Windows 4 26-02-2021 15:38
CMD/BAT - Создание .bat файла для выборки строк из .csv файла в .xlsx GODolubOFF Скриптовые языки администрирования Windows 10 14-12-2015 15:34
PowerShell - [решено] Добавление информации из csv-файла в AD с обработкой IvanXXL Скриптовые языки администрирования Windows 12 23-07-2014 10:49
CMD/BAT - [решено] Периеминование файла doc.csv в Документ_дата_время.csv kagorec Скриптовые языки администрирования Windows 2 29-03-2014 18:40
PowerShell - [решено] Перекодировка файла .csv из windows-1251 в utf-8 sea707 Скриптовые языки администрирования Windows 2 02-09-2012 21:41




 
Переход