SQLite3, сделать выборку из большого файла csv
Доброго времени суток! Есть большая таблица csv 1.2ГБ, которая постоянно дополняется данными в конец таблицы. В таблице 52 столбца и уже более 20 миллионов строк. Мне нужно сделать выборку из этой таблицы по списку из AD самых свежих данных, по имени и дате. Я ранее пытался сделать это с помощью powershell и даже сделал, но производительность очень мала и ждать приходится более 8 часов. Мне на этом форуме сразу посоветовали работать с таблицей как с базой данных, я сопротивлялся, но мне прислали еще несколько таблиц больших размеров и мне все же придется научиться работать с базами. Как мне и посоветовали начать с SQLite3. Скачал, распаковал, запустил, создал базу test, импортировал туда свою таблицу. Через sqlitestudio видно, что все названия столбцов импортировались удачно, так же как и данные. В базе есть два столбца, по которым ориентируюсь: Data, System_Unit_Name. Нужно выбрать уникальное значение из System_Unit_Name с самой старшей датой из столбца Data, далее экспортировать всю строку (все 52 столбца) в таблицу или другую базу, чтобы далее работать с ней. Далее уже наверное буду скриптом сравнивать с AD и вылавливать нужные данные. Возможно с базами не так работают, но это мой первый опыт. В идеале я хочу завернуть все в скрипт powershell, чтобы полностью автоматизировать процесс. Проблема в том, что я не могу самостоятельно составить такой запрос. Надеюсь кто-нибудь поможет, ну или вообще я все неправильно придумал и это не осуществимо.
|
1. А поле Data у Вас — дата? Или как в csv — строка? Вообще, чтобы:
Цитата:
2. Цитата:
В первом случае проблем нет (я и в параллельной теме сделал для текстовых файлов, всё никак не допишу текстовку; ответите здесь на вопросы — допишу): Код:
SELECT DISTINCT *
|
Вложений: 1
Цитата:
Цитата:
Цитата:
примерно вижу это так: Приложил скрин и пример таблицы как ее загрузил в базу и пример желаемого результата. Получается выбирать из поля Ping значения все кроме NO, потому что поле иногда бывает пустым, но данные присутствуют. Выбрать все значения для одного System_Unit_Name из таблицы AD_list, куда поместится список имен AD. Выбрать старшую строку по дате из прошлой выборки. Поместить в таблицу Кстати подумал, что если из базы удалить дубли то объем данных порядком сократиться. Например, есть дублирующиеся строки, где все данные в столбцах одинаковые. Т.е. это одна и та же строка скопированная 2-100 раз. Так же по данным видно, что информация редко меняется, кроме поля дата. Если удалить дубли по всем полям кроме дата и оставить только самые младшие значения по дате, то исторические данные и изменения останутся, а база похудеет и будет весить несколько метров, а то сейчас 700 метров. |
Цитата:
Если сие возможно — подготовьте новый образец файла 1.csv и выложите его в ту тему. Цитата:
Цитата:
Если будет возможность поизучать теория и принципы построения реляционных баз данных — сделайте это. |
Цитата:
Цитата:
Код:
CREATE TABLE IF NOT EXISTS AD_result AS |
Вложений: 2
Цитата:
Цитата:
Импортировал в базу "all_pc_info", таблицу с данными "all_pc", из которых и надо сделать выборку, так же импортировал в таблицу "AD_list" список имен АД в один столбик (название столбца System_Unit_Name). Далее пробовал делать запрос, но ничего не происходит. Для наглядности, что в базе и скрин команд прикладываю. |
Цитата:
Код:
CREATE TABLE IF NOT EXISTS all_pc_result AS |
Цитата:
|
Цитата:
Код:
... |
Цитата:
|
Цитата:
Код:
CREATE TABLE IF NOT EXISTS all_pc_result AS |
Цитата:
Пробовал COLLATE NOCASE, но это работает только для WHERE |
Пока только идея возвести AD_list(System_Unit_Name) и all_pc(System_Unit_Name) в один регистр, а уже потом делать выборки.
Решение: Код:
UPDATE all_pc Скрытый текст
Теперь попытаюсь это автоматизировать через PSSQLite (модуль для powershell). Запрашивать нужную аушку, создавать свежий список в ad_list. Далее выборка из таблицы с данными. Далее экспорт таблицы csv. Но обсуждение наверное не для этой ветки форума.
|
замена Lke
Цитата:
Код:
CREATE TABLE IF NOT EXISTS all_pc_result AS |
Цитата:
Оставил вариант с понижением регистра. Столкнулся с проблемой экспорта таблицы в csv, криво выгружает кириллицу. |
Цитата:
Так-то, в Вашем оригинальном CSV была UTF-8 без BOM. |
Цитата:
Код:
sqlite3.exe -header D:\SQlite3\base_test\all_pc_info.db -tabs "select * from all_pc_result" > $outfile Код:
Майкрософт Windows 10 Pro 64-разрядная Цитата:
|
Цитата:
Цитата:
Чем Вы смотрите Ваш $outfile? Чем смотрели 1.csv, который ранее выкладывали по моей просьбе в соседней теме? |
Цитата:
То есть кракозябры только после экспорта из базы. |
Цитата:
Скрытый текст
Ровно так же будет выглядеть и $outfile, если его кодировка будет в UTF-8. Другое дело, если мы будем делать импорт внешних данных из подобного .csv — там можно указать кодировку исходного файла: Скрытый текст
и тогда кириллица будет нормально отображаться. Что касается Notepad++ — убедитесь, что выбрана правильная кодировка файла: Скрытый текст
|
Вложений: 2
Цитата:
Цитата:
Возможно есть другие методы экспорта данных? |
Время: 00:52. |
Время: 00:52.
© OSzone.net 2001-