Как открыть файл csv объемом 1.7Гб в LO Calc

Автор dd4, 30 марта 2019, 17:19

0 Пользователи и 1 гость просматривают эту тему.

dd4

Добрый день.
Имеется файл объемом около 1,7Гб в формате csv. При попытке открыть его в ЛО - пишет, что недостаточно памяти.
Порезал его на куски по 10000 строк - открывается без проблем.
Но мне нужно делать поиск информации в таком файле - а каждый раз открывать по 10000 строк очень накладно по времени.
Как решить вот такую проблему?
Спасибо.

JohnSUN

Когда я столкнулся с подобным монстром, я очень быстро бросил попытки открыть эту гадость в таблице. Сразу переключился на конечную задачу - поиск и отбор нужных данных.
Файл на 90% состоял из "мусора", который для моей задачи был не нужен - какие-то дурацкие километровые ссылки на какие-то изображения, многословные описания... А выбрать из всей этой каши нужно было только колонки с артикулом, ценой и количеством.
Поэтому задачу решал макросом - открывал файл как обычный текстовый, читал его строка за строкой, с помощью SPLIT() по символу разделителю разрезал на отдельные поля, выбирал нужные в массив... "Нужные" - это в смысле, только нужные колонки и только те, что соответствовали правилам отбора - с ненулевыми количествами и положительными ценами
В самом конце создавал новую книгу Calc и вставлял получившийся массив с помощью .setDataArray()
Получилось довольно быстро, минут в пять уложился.
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

dd4

#2
Да, Вы правы - из этого файла меня интересует только данные, которые указаны лишь в двух колонках.
Цитата: JohnSUN от 30 марта 2019, 17:31читал его строка за строкой, с помощью SPLIT()
Т.е. Вы просматривали каждую запись? Если так, то мне не надо таким образом просматривать записи - надо просто инфо из двух колонок.
На 100 000 строк файл в формате csv занимает почти 24Мб, в формате ods (остались только нужные мне 2 колонки) - около 4Мб.
Разбил по 500 000 строк в файле. Получается, что в исходном файле более 7 000 000 строк. Я их смогу отрыть в ЛО и удалить ненужные мне столбцы. Уменьшится объем.
Подскажите, как их смотреть в одном документе? ЛО ведь не откроет файл на такое количество строк?

JohnSUN

#3
А, это не проблема - сейчас подготовлю "козу" из того старого кода... подожди немного, в текст комментариев набросаю, чтобы понятно было

UPD. Погоди, 7 миллионов строк? Так они по любому в таблицу не влезут... Тебе их просто перепаковать в другой файл надо? Или отбирать некоторые из этих строк по какому-то условию будешь и их меньше станет?
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

dd4

Да, очень много строк. Нужны все.
Я вот 500 000 строк (удалив ненужные колонки, осталось только 2) сохранил в формате ods.
Попробую сделать файл, в котором будет несколько листов с 1 000 000 строк каждый.
Останется потом только разобраться, как делать фильтр по всем листам одной книги.

JohnSUN

Цитата: dd4 от 30 марта 2019, 18:22
Останется потом только разобраться, как делать фильтр по всем листам одной книги.
Так я ведь к этому и клоню - может быть стоит сразу отфильтровать? По каким условиям? Вхождение текста? Значение больше нуля? Что-то другое? Или вообще просто просуммировать отфильтрованное?
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

mikekaganski

7 млн строк нужно обрабатывать не в Calc
С уважением,
Михаил Каганский

dd4

Цитата: mikekaganski от 30 марта 2019, 19:127 млн строк нужно обрабатывать не в Calc
Согласен. Но я в этих вопросах не разбираюсь.
Все эти данные я получил с официальных сайтов - ничего пиратского.
Файл "Исходный.csv" - это отрезанный кусочек от большого файла. Файл "Результат.ods" - это то, что мне надо: 3 колонки, ну и более 7млн. строк, в которых еще и поиск надо будет делать.

JohnSUN

Три колонки? Ты в Результат 4 колонки впихнул...
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

mikekaganski

Воспользуйтесь Base. При создании соединения подключитесь к имеющейся БД типа "текст".
С уважением,
Михаил Каганский

JohnSUN

Цитата: mikekaganski от 30 марта 2019, 19:12
7 млн строк нужно обрабатывать не в Calc
Ой, это верно... Как по мне, файлы такого размера вообще не стоит обрабатывать - потерять его втихаря да и дело с концом... Место на диске освободится  ;)

А если серьёзно, то случаи бывают разные. Я с монстром столкнулся, когда помогал приятелю-индусу обработать такой файл. Приятель занимается конвертацией прайс-листов от разных поставщиков в фиксированный CSV-формат для выгрузки на сайт. Обычно входные файлы пристойного размера, в Calc'е обрабатываются быстро и аккуратно, все эти различные кодировки, разные форматы разделителей, разная логика для разных поставщиков - всё это работает хорошо и быстро. И приятель выстроил за несколько лет довольно стройную систему макросов, которая устойчиво работала пока не пришёл этот файл, гигантское исключение из правил. Пихать ещё один дополнительный инструмент в отлаженную систему очень не хотелось. Вот и пришлось изгаляться... Там, кстати, всё закончилось хорошо - результат был где-то полторы тысячи строк, в лист поместились.

В общем, "коза" решения выглядит вот так

Но для обработки именно этого файла - mikekaganski прав - лучше использовать Base
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

dd4

Цитата: JohnSUN от 30 марта 2019, 20:19В общем, "коза" решения выглядит вот так
Подскажите, пожалуйста, как пользоваться? (Макросы я нашел, а вот что делать дальше?).

JohnSUN

Ну, что?.. в 10-ой строке меняешь "F:\Upwork\Новые вопросы\Файлы\Исходный" на полный путь к твоему гигантскому файлу, нажимаешь F5, чтобы запустить макрос на выполнение, и идёшь выбирать Президента... Когда вернёшься, на экране будет открыта новая книга с пачкой листов "Результат 0", "Результат 1" и так далее, в которых и будут отобранные данные
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

dd4


Rafik

Можно было этот монстр, нужные колонки, попробовать загнать в БД Base и оттуда запросом вытаскивать интересующие (отфильтрованные) строки. Будет работать если, конечно, размер вытаскиваемых данных не больше лимита по строкам в calc ЛО.