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

Компьютерный форум 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

 

Ветеран


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

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


1. А поле Data у Вас — дата? Или как в csv — строка? Вообще, чтобы:
Цитата Griboed0ff:
есть два столбца, по которым ориентируюсь: Data, System_Unit_Name »
поле Data должна иметь тип дата-время. Тогда хоть какая-то гарантия, что не будет двух одинаковых строк по полям Data и System_Unit_Name.

2.
Цитата Griboed0ff:
выбрать уникальное значение из System_Unit_Name с самой старшей датой из столбца Data »
Вот эта самая «самая старшая дата» — она будет одинакова для всех искомых System_Unit_Name? Или для одного значения из System_Unit_Name может быть одна, для другого — другая «самая старшая дата»?

В первом случае проблем нет (я и в параллельной теме сделал для текстовых файлов, всё никак не допишу текстовку; ответите здесь на вопросы — допишу):
Код: Выделить весь код
SELECT DISTINCT * 
    INTO [ResultTable] 
    FROM [SourceTable] 
    WHERE 
        Ping = 'Yes' AND 
        Data = (SELECT MAX(Data) FROM [SourceTable]) AND 
        System_Unit_Name IN (SELECT MachineName FROM [MachineNames]) 
    ORDER BY System_Unit_Name
Выбираем уникальные строки из исходной таблицы по условиям:
  • поле Ping = 'Yes';
  • поле Data равно максимальному из значений поля Data;
  • поле System_Unit_Name входит в перечень значений поля MachineName из таблицы MachineNames (туда Вы помещаете Ваш список имён машин из AD).
Сортируем результирующие строки по полю System_Unit_Name. Помещаем результирующие строки в таблицу ResultTable.

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



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

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


Старожил


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

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


Вложения
Тип файла: rar пример.rar
(63.0 Kb, 3 просмотров)

Цитата Iska:
1. А поле Data у Вас — дата? Или как в csv — строка? »
В столбце Data - дата. В базе пометил столбец как DATETIME.
Цитата Iska:
Тогда хоть какая-то гарантия, что не будет двух одинаковых строк по полям Data и System_Unit_Name. »
Дублей с абсолютно одинаковыми строками очень много. Скорее всего перед манипуляциями придется удалить дубли.
Цитата Iska:
Или для одного значения из System_Unit_Name может быть одна, для другого — другая «самая старшая дата»? »
Верно.

примерно вижу это так:
Приложил скрин и пример таблицы как ее загрузил в базу и пример желаемого результата.
Получается выбирать из поля Ping значения все кроме NO, потому что поле иногда бывает пустым, но данные присутствуют.
Выбрать все значения для одного System_Unit_Name из таблицы AD_list, куда поместится список имен AD.
Выбрать старшую строку по дате из прошлой выборки.
Поместить в таблицу

Кстати подумал, что если из базы удалить дубли то объем данных порядком сократиться. Например, есть дублирующиеся строки, где все данные в столбцах одинаковые. Т.е. это одна и та же строка скопированная 2-100 раз. Так же по данным видно, что информация редко меняется, кроме поля дата. Если удалить дубли по всем полям кроме дата и оставить только самые младшие значения по дате, то исторические данные и изменения останутся, а база похудеет и будет весить несколько метров, а то сейчас 700 метров.

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


Отправлено: 15:31, 17-09-2021 | #3


Ветеран


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

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


Цитата Griboed0ff:
Дублей с абсолютно одинаковыми строками очень много. Скорее всего перед манипуляциями придется удалить дубли. »
Рассмотрите вопрос о том, чтобы в поле Data в CSV писались значения даты-времени, а не только даты. И не в виде строки (в кавычках), а в виде какого-либо из стандартных форматов даты-времени. Это будет правильным.

Если сие возможно — подготовьте новый образец файла 1.csv и выложите его в ту тему.

Цитата Griboed0ff:
Верно. »
Бяда-пичаль . Время обработки будет NxM. Потому что надо будет для каждого из уникальных System_Unit_Name выбирать максимальное значение даты, и только потом отбирать эту строку. Одним запросом такого напрямую не сделать (потому что предикат ORDER BY применяется в последнюю очередь, уже после отбора). Насколько я понимаю, во всяком случае.

Цитата Griboed0ff:
Так же по данным видно, что информация редко меняется, кроме поля дата. Если удалить дубли по всем полям кроме дата и оставить только самые младшие значения по дате, то исторические данные и изменения останутся, а база похудеет и будет весить несколько метров, а то сейчас 700 метров. »
Не надо. Это не так работает.

Если будет возможность поизучать теория и принципы построения реляционных баз данных — сделайте это.
Это сообщение посчитали полезным следующие участники:

Отправлено: 23:10, 17-09-2021 | #4


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

Ветеран


Contributor


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

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


Цитата Iska:
Одним запросом такого напрямую не сделать (потому что предикат ORDER BY применяется в последнюю очередь, уже после отбора). »
Iska, группы, Холмс, юзайте группы. А сортировку ТС не просил.
Цитата Griboed0ff:
Получается выбирать из поля Ping значения все кроме NO, потому что поле иногда бывает пустым, но данные присутствуют.
Выбрать все значения для одного System_Unit_Name из таблицы AD_list, куда поместится список имен AD.
Выбрать старшую строку по дате из прошлой выборки.
Поместить в таблицу »
Griboed0ff, выборка из таблицы AD_list в таблицу AD_result
Код: Выделить весь код
CREATE TABLE IF NOT EXISTS AD_result AS
SELECT *
FROM AD_list
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)))
Это сообщение посчитали полезным следующие участники:

Отправлено: 15:33, 19-09-2021 | #5


Старожил


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

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


Изображения
Тип файла: png Снимок3.PNG
(52.4 Kb, 4 просмотров)
Тип файла: png Снимок4.PNG
(16.9 Kb, 4 просмотров)

Цитата Iska:
Рассмотрите вопрос о том, чтобы в поле Data в CSV писались значения даты-времени, а не только даты. »
Данные уже имеются в таком виде как есть и приходится работать с ними.
Цитата El Sanchez:
выборка из таблицы AD_list в таблицу AD_result »
К сожалению у меня не получилось, скорее всего из-за отсутствия знаний.
Импортировал в базу "all_pc_info", таблицу с данными "all_pc", из которых и надо сделать выборку, так же импортировал в таблицу "AD_list" список имен АД в один столбик (название столбца System_Unit_Name). Далее пробовал делать запрос, но ничего не происходит. Для наглядности, что в базе и скрин команд прикладываю.

Отправлено: 10:51, 20-09-2021 | #6


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

Ветеран


Contributor


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

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


Цитата Griboed0ff:
Далее пробовал делать запрос, но ничего не происходит. Для наглядности, что в базе и скрин команд прикладываю »
Griboed0ff,
Код: Выделить весь код
CREATE TABLE IF NOT EXISTS all_pc_result AS
SELECT *
FROM all_pc
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)))
Это сообщение посчитали полезным следующие участники:

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


Старожил


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

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


Цитата El Sanchez:
Код: Выделить весь код
CREATE TABLE IF NOT EXISTS all_pc_result AS
SELECT *
FROM all_pc
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)));
»
Спасибо получилось! Но насколько я понял, создается таблица из запроса, выбирается таблица с данными, не берем строки со значением NO, а далее просто выбирается для каждого System_Unit_Name, строка с максимальной датой. Т.е. никакого сравнения со списком AD из таблицы AD_list нет. В принципе я уже получил хороший результат и можно сделать впр со списком AD вручную или powershell. Или возможно создать еще один запрос, который возьмет значение из таблицы AD_list столбик System_Unit_Name, найдет его с столбике System_Unit_Name таблицы all_pc_result, экспортирует строку его в еще одну таблицу. Ну или возможно добавить это в старый запрос?

Отправлено: 13:32, 20-09-2021 | #8


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

Ветеран


Contributor


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

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


Цитата Griboed0ff:
Или возможно создать еще один запрос, который возьмет значение из таблицы AD_list столбик System_Unit_Name, найдет его с столбике System_Unit_Name таблицы all_pc_result, экспортирует строку его в еще одну таблицу. Ну или возможно добавить это в старый запрос? »
Griboed0ff, таблица AD_list точно нужна? Не, можно и её использовать, можно и конкретные System_Unit_Name в запросе указывать:
Код: Выделить весь код
...
WHERE Ping <> 'No' AND System_Unit_Name IN ('foo', 'bar', 'baz')
...
Это сообщение посчитали полезным следующие участники:

Отправлено: 17:04, 20-09-2021 | #9


Старожил


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

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


Цитата El Sanchez:
таблица AD_list точно нужна? »
Да точно нужна, там в AD 14k имен.

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



Компьютерный форум 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




 
Переход