Выбрать дату в календареВыбрать дату в календаре

Страницы: 1 2 След.
Поиск в файле csv, не открывая его
 
Цитата
Hugo написал:
Ранее я такого не замечал, вероятно потому что никогда так не делал, или процессы всегда были быстрые.
И процессы были быстрее, и объемы были меньше :) Я прогнал на машине, где не было запущено каких-либо лишних процессов, отжирающих память и ресурсы процессора. Мои выводы следующие: скорость индексирования не остается величиной примерно одинаковой на протяжении всего процесса добавления индекса; она сильно зависит от прироста объема сканируемых строк. Чем больше добавляется строк, тем меньше скорость в сравнении с предыдущим равным объемом. И так далее. Первые 500 000 сканирует за 6 сек. Если добавить еще 500 тыс, т.е. суммарно 1 млн. срок, то сканирование длится 16 сек. Если добавить еще 500 тыс., т.е. суммарно 1,5 млн. строк, то сканирование длится 62 сек. Еще 500 тыс., в сумме 2 млн., сканирование занимает 196 сек. 2,5 млн. - 465 сек. 3 млн. - 839 сек. Причем это не зависит от величины разбиения на строки в пределах файла, т.е. не важно, будет ли это один файл на 500 тыс. строк или 5 файлов по 100 тыс.
Мы так можем разработать стандарт бенчмарков для оценки производительности excel :) Хотя это шутка и игрушки, поскольку у всех нас разное по производительности железо. Я уверен, что моя память и мой hdd - очень-очень средненькие. И вообще не удивительно, что сам эксель, равно как и либр-офис не справляются с такими массивами данных. Они явно предназначены для других целей. А для больших данных скорее всего идеальным инструментом являются инструменты с поддержкой структур в виде баз данных. Там наверняка способ организации работы с данными принципиально отличается от табличных процессоров.
Цитата
bedvit написал:
Добавил третий параметр в функцию - Разделитель (опциональный)
Спасибо. Попробую :)
Поиск в файле csv, не открывая его
 
Цитата
Hugo написал:
Попробуйте на какой другой машине, где памяти побольше, загрузить в словарь хотя бы гигабайт, или каких 50-70 файлов, и гляньте сколько памяти съест Эксель.
Конечно попробкю в разных вариациях. Меня что смутило: в статус-баре действительно в реальном времени показывается номер строки и файла, с которым макрос работает. И я заметил, что все 10 файлов вроде бы просканированы. А потом опять вижу те же наименования файлов, что и до этого, и они опять перебираются.
Поиск в файле csv, не открывая его
 
Цитата
Hugo написал:
мой последний файл не смотрели?
Протестировал на 10-ти файлах csv, которые до этого получил в результате деления одного файла размером 1,2 Гб на фрагменты по 500 000 строк. Сами 10 "индексных" csv суммарно весят 72,1 Мб. Запустил макрос по индексации и стал ждать. Эксель ушел в даун, по диспетчеру процессов наблюдал, что процесс работает, поскольку по чуть-чуть отжирал память. Но эксель долгое время так и не отвисал. Ничего страшного, я терпеливый :) Когда индексация закончилась, появилось окошко со счетчиком.
Рисунок.
Получилось 5326 сек = 88,76 мин. Это конечно долго.
Но с другой стороны, у данного метода есть несомненный плюс. При вводе идентификатора в поле, мгновенно отображается имя файла и строчка.
Я так понимаю, что "индекс" находится в памяти, пока открыт csv2Dictionary.xls. Об этом сужу по тому, что после сохранения файла (когда индекс был считан), он не ищет по идентификатору, а предлагает пересканировать индекс заново (Словарь пропал, просьба зачитать заново). Результат сканирования как-то сохраняется или находится только в памяти?
Изменено: excel_and - 21.05.2020 14:38:25
Поиск в файле csv, не открывая его
 
Цитата
Hugo написал:
мой последний файл не смотрели?
Да, спасибо. Сегодня буду активно тестировать и отпишу результат. Очень любопытно сопоставление производительности разных вариантов решения.
Поиск в файле csv, не открывая его
 
Цитата
bedvit написал:
7 мин это долго, видимо у вас hdd слабоват (в 5 раз медленнее чем у меня на рабочем, среднем ПК), у вас ноутбук?
Попробовал запустить макрос. Все получилось. На идентификаторе в самой последней строке (тот же самый идентификатор, который использовал вчера) таймер показал следующее:
Time, sec:  423,0791015625 = 7,05 мин.

Вчера этот показатель был 7 мин 02 сек. Т.е. результаты схожие. Это очень хороший результат, поскольку в отсутствие вашего инструмента поиск занимал бы существенно больше времени. У меня средний по производительности ноутбук, купленный 3 года назад. Не игровой, диск обычный, не SSD. Думаю, что на SSD должен быть кратный прирост, но мне не на чем проверить. В любом случае, все работает.

Цитата
bedvit написал:
GetRowCSV(файл, номер строки-начинается с 1)
За вторую функцию тоже спасибо.
Если удастся (будет желание) реализовать вывод всех строк по заданным идентификаторам, которые повторяются в файле, это будет вообще инструмент с универсальным функционалом. Т.е. это аналог "живого" автофильтра, который в эксель жутко тормозит на тяжелых файлах с большим числом строк.
Цитата
Hugo написал:
Значит если использовать предварительную индексацию в словаре - есть смысл файлы разбивать на части.
Смысл есть. Ведь есть разные подходы к решению задачи и разные ограничения.
Поиск в файле csv, не открывая его
 
Цитата
Андрей VG написал:
Поставить, например,  TablePlus , его триальная версия вполне поддерживает загрузку csv в базу SQLite. Загрузить ваши csv, проиндексировать по 12 столбцу. Поставить драйвер  SQLite . Начать изучать SQL
TablePlus нашел вроде бы полнофункциональный, но еще не ставил. Попробую поэкспериментировать. В т.ч. с другим софтом из комплекта.
Цитата
bedvit написал:
Тест-файл прилагаю, протестируйте в VBA на вашем файле в 10 ГБ (на одном, а не на 115). Код теста я уже написал, вам нужно только будет изменить путь к вашему файлу и запустить.
Код вставил в файл xlsm, предварительно изменив в коде путь к тяжелому файлу и заменив идентификатор, который присутствует в самом конце файла. Запускаю макрос: вижу, что-то происходит, колесико крутится, примерно те же 7 минут. Но когда макрос отрабатывает, то ничего не появляется: ни найденная строка в xlsm-файле, ни счетчик с таймингом. Надстрока xll установлена. Предварительно ее запускал для пущей гарантии. Что я делаю не так?
Поиск в файле csv, не открывая его
 
Цитата
bedvit написал:
Итак, функция "FindInCSV" в категории функций "Bedvit_xll" (не реклама, а старая версия библы, не стал заморачиватся, переименовывать).
Штука действительно очень шустрая (в сравнении с тормозным эксель, где нельзя даже нормально искать строку через фильтр на огромных файлах, ибо зависает надолго и потом закрывается). Сделал точный хронометрах производительности, для этого использовал таймер от Free Stopwatch. Благо, что были нарезанные по 500 000 строк файлы, полученные от оригинала в 10 Гб. Это позволяет проследить процесс в динамике. Всего файлов было 116, поименованы от 0 до 115. Выбирать идентификатор для поиска старался максимально близко к последним строкам. Ниже - показатели производительности (номер файла и время поиска):
0 - 5 сек (не информативно, т.к. в этом файле мало идентификаторов)
10 - 35 сек
20 - 1 мин 08 сек
30 - 1 мин 42 сек
40 - 2 мин 18 сек
50 - 2 мин 51 сек
60 - 3 мин 31 сек
70 - 4 мин 06 сек
80 - 4 мин 46 сек
90 - 5 мин 30 сек
100 - 6 мин 36 сек
115 - 7 мин 02 сек
Таким образом, можно считать, что файл в 10 Гб обрабатывается максимум в течение 7 мин (если строка для поиска находится в самом конце файла).
Поиск производится построчно, проверяя каждый столбец последовательно, друг за другом.
На что еще обратил внимание: можно в строке для поиска использовать любой другой идентификатор, т.е. не только из 12 столбца, а вообще любые символы. Результатом поиска также является строка, где эти символы присутствуют.
Это расширяет возможности инструмента и делает его универсальным инструментом для поиска в csv-файлах.
Сканирование останавливается при нахождении строки для поиска. А можно ли доработать инструмент так, чтобы на других (т.е. несколько раз повторяющихся) найденных идентификаторах (не обязательно в 12-ом столбце, я так понял привязки к столбцу, как таковому, нет) добавлялась новая строка, ниже предыдущей. Т.е. поиск не заканчивался на первом совпадении, а продолжался так до конца файла, добавляя все новые строки при появлении повторяющихся идентификаторов. Так можно реализовать фильтр по произвольным символам, который в реальном времени будет добавлять новые строки, если идентификаторов в файле будет найдено несколько.
Цитата
bedvit написал:
Можно использовать в VBA через Application.Run
Т.к. я ало чего понимаю в макросах, то использовал файлы методом тыка. Открыл xlsb, ввел путь к папке, далее идентификатор. Что-то не получилось. Далее запустил xll и все начало работать. Полагаю, что реализация xll возможна в виде макроса. Научите, как это делается? Нужно в меню "Разработчик" - Visual Basic ввести код макроса? А как его просмотреть?
Очень познавательный получился тред. Спасибо всем участникам за помощь и рекомендации.
Поиск в файле csv, не открывая его
 
Цитата
Андрей VG написал:
Power Query даже с ленивым In загружает за менее секунды (дольше ширину столбцов подгоняет).
Мне интересно испытать вашу конструкцию на Power Query, но только не понятен порядок моих действий. У меня есть много исходных csv (в каждом более 500 000 строк и 26 столбцов, структуру файлов я привел). Также есть ровно такое же количество других csv-файлов, но только с данными исключительно из 12-го столбца (этот столбец генерировался специально в соответствии с выбранной стратегией поиска. Задумка была такая: чтобы компьютер не зависал на операциях поиска в большом числе тяжелых файлов, проще выполнять поиск нужного идентификатора на маленьких csv, а уже потом, при выяснении, что такой идентификатор присутствует, искать относящиеся к нему данные, расположенные в строке большого исходного файла. Причем искать можно как прямым открытием тяжелого файла в эксель и поиск по фильтру в 12-ом столбце, так и с использованием виндовой утилиты find).
Что мне нужно сделать, чтобы проверить ваш вариант, где присутствует следующий код?

Код
let
    Source = Odbc.Query("DRIVER=SQLite3 ODBC Driver;Database=C:\Path\SQLite\demoSQLite.sqlite;LongNames=0;Timeout=1000;NoTXN=0;SyncPragma=NORMAL;StepAPI=0;", "Select * From [col12Table] Where [Column12] In ('abc000000003','bcd000000003','cde000010003','def000000003','efg000080003','fgh000000003','ghi000000003','hij000000003','ijk000000003','jkl000000003','klm000000003','lmn000000003','mno000000003','nop000000004','opr000000003','prs000000003','rst000000003','stu000000003','tuv000000003','uvw000000003');")
in
    Source

Я вижу, что в коде есть адрес со ссылкой на файл sqlite. Как его получить для моих файлов? И что делать потом?
Изменено: excel_and - 20.05.2020 00:05:25
Поиск в файле csv, не открывая его
 
Цитата
Hugo написал:
в самих csv тоже может быть такая пересортица? По логике там обязано всё быть ровно
И в исходных файлах, и в "индексном" файле все одинаково, по-другому быть не может. Просто когда стандартным способом (поиск по точному значению в "индексах" при помощи find или notepad++) чего-то не находил, сравнивал с индексом Архивариуса и он при расширенных опциях выдавал значения, идентичные визуально, но с разными кодами символов ASCII.
Изменено: excel_and - 19.05.2020 21:44:37
Поиск в файле csv, не открывая его
 
Цитата
bedvit написал:
excel_and , скиньте файл, я вам сделаю простое решение - функцию в Excel, возвращающую нужную часть строки или всю строку, по первому совпадению из указанного csv.
Во вложении - пример СТРУКТУРЫ csv-файлов, в КОТОРЫХ нужно искать заданные совпадения (предположим строку "ASD123FGH456", она как раз присутствует в примере). Из-за огромного размера нескольких файлов пришлось разбивать их на части, по 500 000 строк (с помощью скрипта, который посоветовал Hugo), что на выходе дало много csv. Соответственно поиск по совпадению должен производиться во всех этих csv, которые можно положить в одну папку. Это, как уже обсуждалось, можно сделать при помощи консольной утилиты find, которая входит в состав Windows. Правда find работает не очень быстро, но все же работает.

Идея с индексом (будем это называть так) заключалась в том, чтобы создать ОТДЕЛЬНЫЙ ФАЙЛ ИЛИ НЕСКОЛЬКО (ввиду ограничений Excel на число строк, а их будет около 130 млн.!!!), в котором бы присутствовали заданные идентификаторы (извлеченный из всех csv 12-ый столбец (СТОЛБЕЦ L) только с идентификаторами). Если поиск нужного идентификатора в ИНДЕКСНОМ ФАЙЛЕ (ФАЙЛАХ) находит совпадение, то уже тогда целесообразно производить поиск, как указано выше. Т.е. чтобы сэкономить время на поиск во всех csv, сперва нужно убедиться, что сам идентификатор присутствует в ИНДЕКСНОМ ФАЙЛЕ/ФАЙЛАХ со всеми извлеченными заранее из всех csv идентификаторами. И уже потом выводить номер строки со ссылкой на соответствующий csv из папки (или всю строку полностью, желательно также со ссылкой на исходный файл).

Если при реализации функции будет возможен поиск с использованием подстановочных символов "*" (заменяет любое число символов) или "?" (заменяет один символ), это будет самое идеальное решение. Это объясняется тем, что на основе анализа выявлены идентификаторы, где одинаковые по написанию символы на латинице и на кириллице создают проблему при ТОЧНОМ поиске идентификатора. Например "ASD123FGH456" (в латинице) может визуально быть похожим на "АSD123FGН456" (в кириллице). Вопрос с поиском всегда бы заканчивался удачно, если бы строка для поиска могла бы быть задана в виде "?SD123FG?456".

Заранее спасибо.
Изменено: excel_and - 19.05.2020 19:17:08
Поиск в файле csv, не открывая его
 
Цитата
Андрей VG написал:
Адаптировать тот или другой код под структуру ваших файлов, естественно. Вы же постеснялись выполнить не одну такую просьбу
Постеснялся от непонимания того, как это работает, и хватит ли моего уровня для адаптации предложенного решения :)
Поиск в файле csv, не открывая его
 
Цитата
БМВ написал:
А имеющиеся инструменты - ну да, поддерживаю идею индексирования файлов по 12му столбцу.
Да, этот вариант работает гарантированно.https://shtr
Цитата
bedvit написал:
Приложите небольшой пример csv-файла, что ищем и какой результат возвращаем. Будет время сделаю вам библиотеку, думаю, будет быстрее всего, здесь предложенного. У вас сколько ОЗУ, какой разрядности система, в каком формате/кодировке csv файл?
Спасибо. Приложу чуть позже. Или напишу в ЛС. ОЗУ - 4 Гб, система win 8.1 x64, кодировка ANSI.
Цитата
Андрей VG написал:
Если кого заинтересует, то архив распаковывать в папку C:\Path
А как мне проверить ваш способ? В папку "C:\Path\csv files" закинуть свои тяжелые файлы и потом запустить query.xlsb? Так сделал, но ничего не получилось :)
sokol92
Hugo
Я встречал базы с еще большим числом данных, но они и весили гораздо меньше (как описывает Hugo) и поиск в них происходит очень шустро. Это базы в системе Cronos. Может, стоит перегнать все в эту базу? Никто не сталкивался с перегонкой в Cronos?
Изменено: excel_and - 19.05.2020 16:33:34
Поиск в файле csv, не открывая его
 
Цитата
Михаил Л написал:
Вводить в А3 не надо, только путь к папке в А1. После нажатия трех клавиш запрос в каждый столбец введет 12 столбец файлов. Пока посмотрим сколько времени надо
Установил поверх своего офиса (x86) Power Query (тоже x86) по вашей ссылке.
Решил просто попробовать на одном файле размером 1,2 Гб. Ввел путь к папке с этим единственным файлом, нажал Ctrl+Alt+5. Ждал 5 минут. Появилось сообщение "Данные, возвращаемые запросом, не умещаются на листе". Подтвердил ОК и отобразились данные из 12 столбца (насколько это поддерживает эксель). Смутило, что символы (кроме цифр), в большинстве своем, отображаются в виде крякозябр. Дело в кодировке. Но сам эксель (не через запуск в Power Query) символы отображает корректно. Вот пример того, что вижу.
Решил попробовать на папке, где находятся 10 файлов по 500 000 строк, полученные из файла в 1,2 Гб. Ждал 15 минут, пока откроются 10 столбцов, содержащих 12-ый столбец каждого из файлов в папке. Опять отображаются крякозябры. Действительно, компьютер подвисает очень прилично. Но памяти чуть свободной остается (из 4 ГБ оперативки где-то 20% свободны), а вот процессор все время загружен на 100%. При этом никаких активных процессов, которые расходуют прилично память, на ПК не запущено.
Итог по процессу: все работает, только расходует много памяти и отображает крякозябры. Но я так понял, что Power Query гораздо шустрее обрабатывает тяжелые файлы в сравнении с эксель. Думаю, что фильтры и формулы в Power Query будут работать так же быстро. Но для этого нужно знать синтаксис PQ.
Цитата
PooHkrd написал:
Но опять же если идея в том чтобы вытаскивать из огромного массива значения фильтрами, то можно скачать MS Power BI Desktop он бесплатный, и загрузить в модель данные с его помощью, а далее уже фильтрами вытягивать нужные значения в аналог экселевской сводной таблицы
Да, все верно. Именно такая идея была изначально. И это самый оптимальный вариант. Тут вопрос в производительности, т.е. насколько шустро MS Power BI Desktop будет обрабатывать все это тяжелое добро. В принципе, на домашнем ПК можно и попробовать. Но софт ведь тоже требует каких-то специфических знаний команд и т.п.?
Цитата
Hugo написал:
MS Power BI ~~ Qlik, что я уже упоминал на той ещё странице в #6Если не влезет всё - то думаю можно в модель загрузить только эти артикулы с координатами (имя файла, номер строки), а далее уже вытягивать всю строку чем-то другим.Получится типа словаря
Да, так конечно удобно. Но вот реализовать я сам не смогу (скачать и установить могу все что угодно) :)
Изменено: excel_and - 19.05.2020 02:12:56
Поиск в файле csv, не открывая его
 
Цитата
Михаил Л написал:
excel_and , какая версия Excel?Ради интереса задайте путь к папке с файлами по 500 000 строк и попробуйте нажать Ctrl+Alt+F5 (желательно сначала проверить файлах на тридцати)Разделитель - ; (точка с запятой)
Excel 2010. Не совсем понял, что нужно сделать с файлом. Если в ячейку A1 (по умолчанию указано "D:\temp\папка") ввести путь к папке поиска, я в ячейку A3 (по умолчанию указано "А") ввести идентификатор для поиска (он 100% присутствует в папке поиска), то по нажатию Ctrl+Alt+F5 у меня появляется сообщение "Сбой инициализации источника данных. Проверьте сервер или обратитесь к администратору базы данных. Убедитесь, что внешняя база данных доступна и вновь повторите операцию. При повторении сообщения создайте новый источник для подключения к базе данных".
Цитата
bedvit написал:
Подумал о таком  решении , можно реализовать, в виде exe или .xll-надстройки для Excel.
Да, это будет слишком сложно для меня :)
Поиск в файле csv, не открывая его
 
Цитата
Hugo написал: objFile.WriteLine Split(strNextLine, ";")(11)
Но это если разделитель полей ;
Спасибо за разъяснение. Проверил на файле в 1,2 Гб. Все работает: и режет по 500 000 строк, и извлекает нужный столбец.

Цитата
PooHkrd написал: можно загрузить весь ваш массив в модель данных и вытаскивать нужную строку фильтром сводной таблицы
Готов попробовать. Но не знаю, что означает "загрузить весь массив в модель данных". Как это делается? Используется ли для этого что-то дополнительно, кроме Excel?
Поиск в файле csv, не открывая его
 
Михаил Л
Power Ouery готов установить и протестировать, но никогда им не пользовался.
Изменено: excel_and - 18.05.2020 17:41:55
Поиск в файле csv, не открывая его
 
Hugo
Блин, я протупил :) Но буду знать :) Ничего страшного.

Где (1) нужно поменять на (11)?

objFile.WriteLine strNextLine 'Split(strNextLine, ";")(1) '& " = " & pr

-------

Нет, я оказывается все так и сделал. Т.е. извлекал 12 столбец по первому скрипту из файлов, которые резались по 500 000 строк по второму скрипту. Или вы имели в виду, что второй скрипт, который режет, также позволяет еще и извлекать определенные столбцы? Т.е. одним действием можно сделать то, что я сделал за 2 действия?

Изменено: excel_and - 18.05.2020 17:41:17
Поиск в файле csv, не открывая его
 
Михаил Л
Не секрет. Из одного файла в 10 Гб получилось 116 файлов, каждый из которых (кроме последнего) имеет 500 000 строк. В каждом из файлов - 26 столбцов.
Изменено: excel_and - 18.05.2020 17:16:37
Поиск в файле csv, не открывая его
 
Hugo
Ваш скрипт по разбиению файлов на части по 500 000 строк применил.
На файле 1,2 Гб отработал за 375,739 сек = 6,26 мин. Потом применил на файле в 10 Гб, где он отработал за 3892,195 сек = 64,87 мин. Это отличный результат, т.е. с большими файлами работает.
Далее я начал потихоньку руками извлекать столбцы с нужным идентификатором. Как только получу все эти столбцы, добавлю в индекс Архивариус3000. Думаю, все должно работать. Таким образом, для дома найден сложный и затратный вариант решения проблемы. Делается хоть и долго и через задницу, но тем не менее :)
Рано или поздно Windows добавит содержимое этих файлов (со столбцами с идентификаторами) в свой индекс. Хотя конечно производительность крайне низкая...
Рекомендованные программы для резки и скрипт на powershell обязательно посмотрю.
sokol92
find тоже попробовал. Пришлась очень кстати. Действительно ищет, но при таких объемах результат приходится ждать довольно долго (ибо сканирует каждый файл заново, без возможностей искать при помощи индексирования). Хотя с задачей справляется. Наверное, буду пользоваться ей на рабочем ПК. Пока это тоже вариант.

bedvit
Если вдруг будет время и желание, польза будет неоценимая (особенно, если будут использоваться штатные средства винды и стандартного офиса).
Пока продолжаю экспериментировать, результаты напишу.
Заранее спасибо.
Поиск в файле csv, не открывая его
 
Hugo
Мой опыт с Архивариус3000 следующий:
Размер индекса 10,35 Гб
Время индексирования 02:05:46
Не удалось проиндексировать 2 файла.

Что касается файлов, которые не проиндексированы. Это как раз 2 тяжелых файла: 1-ый с размером 1,2 Гб, 2-ой с размером 10 Гб.
Поиск вроде бы работает (проверял очень бегло всего не нескольким идентификаторам).

Ваш скрипт скорректировал под себя.
Прогнал на среднего размера файлах, 130-150 Мб. Скорость отработки от 50 сек. Заметил, что в исходном файле и в файле с выборкой получается разное количество строк. Думаю, что нужно смотреть в сторону пустых ячеек, они где-то встречаются. Детально буду смотреть завтра.
По поводу тяжелого файла с размером 1,2 Гб. Натравил на него скрипт. Скрипт отработал без проблем, время выполнения 446,6396. Далее открыл файл с выборкой в Excel и увидел сообщение, что файл загружен не полностью. Excel загрузил 1 048 576 строк. Решил открыть файл в LibreOffice, но и в нем присутствует то же самое ограничение на 1 048 576 строк.
В свете имеющихся ограничений на число строк возник еще один вопрос: можно ли один тяжелый csv-файл точно так же разбить с помощью скрипта на несколько файлов с произвольным числом строк, например на 500 000 строк (это соответствует моим размерам файла примерно в 110-115 Мб), сохранив его структуру? Т.е. первые 500 000 строк в 1-ом файле, далее следующие 500 000 строк во втором файле и т.д.). Так можно будет отработать два оставшихся файла в 1,2 Гб и 10 Гб.

Завтра также попробую запустить скрипт на файле в 10 Гб. Мне кажется, должно получиться, хотя не совсем уверен.
Заранее спасибо.
Поиск в файле csv, не открывая его
 
Hugo
Михаил Л
DocFetcher скачал себе сперва портабельную. Запуститься отказалась.Скачал установщик. Установленный вариант тоже не запустился. Посмотрел через Dependency Walker: оказывается, программа не совместима с моей Win 8.1 x64. На виртуальной машине запускать не стал, т.к. это заметная потрея производительности. Потом увидел Ваш комментарий по поводу csv-файлов.
Ради интереса запустил создание индекса в Архивариус3000. Создание индекса 5% от всего объема занимает 13 минут. Т.е. индексировать будет долго, да и тормоза конкретные. Но я дождусь и проверю, как работает поиск.
По поводу работы исключительно с 12-ым столбом. Это - идея. Но скопировать вручную 12-ый столбец я смогу со всех файлов, кроме 2-ух очень тяжелых. На них даже проверять лишний раз не хочу, т.к. система зависает наглухо и просто приходится перезагружать компьютер. Ни один из 2-ух этих тяжелых файлов у меня так и не открылся в эксель, т.к. банально не хватает памяти. Т.е. что-то где-то крутиться, но результат, видимо, придется ждать очень долго. Я ждал 1 час, но ничего так и не открылось. Плюнул и перезагрузил.
А вот можно ли скриптом (макросом) считать весь 12-ый столбец из каждого файла и получить сотню файлов с данными только 12-го столбца. Это уже будет что-то. Но, повторюсь, сделать это нужно без открытия исходных csv-файлов (помня об ограничении с 2-мя очень тяжелыми файлами). А потом по аналогии считать все остальные столбцы из найденного csv слева и справа от 12-го столбца (для случая с тяжелыми файлами более 1 Гб) или вообще всю строчку.
Поиск в файле csv, не открывая его
 
Hugo
В папке порядка 100 файлов, суммарный размер файлов – около 30 Гб. Смущают 2 файла с самыми большими размерами: 10 Гб и 1,2 Гб.
Я хочу попробовать рекомендуемый  DocFetcher. По результату отпишусь.
С Qlik не знаком. Подскажите, пожалуйста, ссылку. Если инструмент помогает при работе с тяжелыми файлами, то это в любом случае будет полезно для общего развития.
doober
Отлично. Пример файла приложу. Но в исходном виде не смогу это сделать, т.к. в нем содержатся персональные данные. Но могу просто внести в ячейки другие значения, думаю, это никак не повлияет на суть задачи.
sokol92
Far имею в виду как дополнительный софт.
Общий принцип таков, чтобы метод не предполагал использования стороннего софта. Здесь ограничения лишь в том, что на работе никто этот софт не позволит установить ни при каких обстоятельствах. А решать задачу поиска необходимо в т.ч. на рабочем ПК, где есть MS Office и возможность выполнять макросы на VBA. Но офис сильно тормозит при открытии тяжелых файлов и очень желательно хоть чуть-чуть автоматизировать процесс, минуя зависание ПК, которое делает невозможным работу.
Поиск в файле csv, не открывая его
 
Александр Моторин
Спасибо. Это один из принципов, как может быть реализовано решение. Полагаю, что техническая сторона реализации содержится в ответе doober
doober
Помогите, пожалуйста, с пониманием того, как работает Ваш способ.
Текст приведенного макроса уже готовый или его нужно переписывать под мою задачу? В VBA не разбираюсь, поэтому задаю такой глупый вопрос.
Мне нужно подставить путь расположения своих файлов. Т.е. нужно задать следующее:
TempPath = " C:\folder\"
Далее в папку положить файл schema.ini. Вижу, что в ini-файле есть повторяющаяся структура. Нужно вставить названия своих csv-файлов и добавить их необходимое количество.
А вот по структуре как понять, что означают поля (т.е. каждая строчка)? Эти строчки как-то нужно корректировать или можно оставить без изменений?
[1.csv]
ColNameHeader=False
Format=Delimited(;)
MaxScanRows=0
CharacterSet=ANSI
Col1=F1 Char Width 255
Col2=F2 Char Width 255
Col3=F3 Char Width 255
Col4=F4 Char Width 255
Col5=F5 Float
Col6=F6 Float
Ну и самое главное, как выполнить sql-запрос? Он выполняется из макроса?
Hugo
Файлы не меняются, равно как и значения в них. Поиск будет выполняться не часто, 10-20 раз в день, а иногда меньше. Учитывая размер файлов, размер индекса будет огромным, зависание будет 100%.
Как вариант, можно натравить на эти файлы программы для построения индекса, например, Архивариус3000. И потом при помощи программы искать.
Но я подумал, что может быть существуют более изящные способы поиска.
Поиск в файле csv, не открывая его
 
Дoбpый дeнь.
Ищeтcя cпocoб, кoтopый пoзвoляeт пpoизвoдить пoиcк в фaйлaх csv, кoтopыe нa мoмeнт пoиcкa НE OТКPЫТЫ В EXCEL и нaхoдятcя в пaпкe пo oпpeдeлeннoму пути, нaпpимep C:\folder\file.csv.
Пpичинa тaкoгo экзoтичecкoгo cпocoбa пoиcкa зaключaeтcя в тoм, чтo кaждый из csv-фaйлoв имeют OГPOМНЫЙ PAЗМEP (oт 150 Мб дo нecкoльких ГБ) ввиду бoльшoгo чиcлa cтpoк. И ecли нужнo нaйти ячeйку c oпpeдeлeнным знaчeниeм (oнo уникaльнo, пpиcутcтвуeт тoлькo в oднoм из этих фaйлoв в пaпкe), нужнo пo пpивычкe oткpывaть пocлeдoвaтeльнo кaждый фaйл и вpучную пpoизвoдить пoиcк пo дaннoму уникaльнoму знaчeнию.
Вoзмoжнo, cитуaцию упpoщaeт тoт фaкт, чтo иcкoмoe уникaльнoe знaчeниe вceгдa будeт нaхoдитьcя в 12-oм пo cчeту cтoлбцу тaблицы (cтoлбeц L). Пo cути нужнo пocлeдoвaтeльнo пpocкaниpoвaть 12-ый cтoлбeц (cтoлбeц L) нa пpeдмeт cooтвeтcтвия нужнoму идeнтификaтopу (этo нaбop иcключитeльнo лaтинcких букв и цифp, бeз пpoбeлoв, никaких cпeцcимвoлoв).
Нo зaдaть идeнтификaтop для пoиcкa нужнo явным oбpaзoм (т.e. уcлoвнo ASD123FGH456) и кaк-тo нaтpaвить нa фaйлы пaпки. Дaжe ecли пoиcк пo вceм фaйлaм пaпки cдeлaть будeт тpуднo, дocтaтoчнo cдeлaть для oднoгo фaйлa, имя для дpугих фaйлoв я гoтoв мeнять кaждый paз вpучную.
Peзультaт тaкoгo пoиcкa в идeaльнoм cлучae дoлжeн быть тaким: вывoд вceх знaчeний из cтpoки тaблицы, в кoтopoй пpиcутcтвуeт идeнтификaтop. Нa кpaйний cлучaй дocтaтoчнo будeт вывoдa имeни csv-фaйлa, гдe тaкoe coвпaдeниe будeт нaйдeнo. Тoгдa я вpучную oткpoю этoт фaйл в экceль и нaйду cпepвa caмo coвпaдeниe, a пoтoм cкoпиpую вcю cтpoчку для дaльнeйшeй paбoты.
Мoжeт ктo-нибудь пoмoчь? Пpeдпoлoжу, чтo этo дeлaeтcя мaкpocoм. Либo кaк-тo инaчe (либo кaким-нибудь sql-зaпpocoм). Нo я нe знaю cпocoбa этoт пpoцecc aвтoмaтизиpoвaть.
Пpимep тaблицы пpиклaдывaю.
Зapaнee cпacибo.
Пoдcчeт знaчeний c нecкoлькими уcлoвиями
 
Огромное спасибо за все ответы. Способы решения задачи - разные, но все рабочие. Вариант от БМВ точь-в-точь соответствует запросу.
Пoдcчeт знaчeний c нecкoлькими уcлoвиями
 
Дoбpый дeнь.
Хoчу paзoбpaтьcя c фopмулoй, кoтopaя пoдcчитывaeт знaчeния пo нecкoльким уcлoвиям, aнaлoгичнo тoму, кaк этo дeлaeт CЧЁТECЛИМН.
В пpимepe нужнo пoдcчитaть для кaждoй ячeйки из cтoлбцa E (ФИO) чиcлo знaчeний из cтoлбцa F (oтдeлы), гдe нeoбхoдимo учecть нecкoлькo уcлoвий (нaличиe oтдeлa c oпpeдeлeнным нoмepoм, a имeннo «Oтдeл 1», «Oтдeл 2» и «Oтдeл 5»).
Зaдaчу cмoг peшить в нecкoлькo этaпoв: пpи пoмoщи CЧЁТECЛИМН cчитaю для кaждoй ячeйки из cтoлбцa E (ФИO) чиcлo знaчeний из cтoлбцa F, cooтвeтcтвующee тeкcту «Oтдeл 1» (cтoлбeц H).
Дaлee тo жe caмoe дeлaeтcя для тeкcтa «Oтдeл 2» (cтoлбeц I) и для тeкcтa «Oтдeл 5» (cтoлбeц J).
Cуммa cчитaeтcя в cтoлбцe K.
Cпocoб пoлучaeтcя cлoжный и нeoптимaльный, нo пo-дpугoму я нe cмoг :)
Пoмoгитe, пoжaлуйcтa, oптимизиpoвaть pacчeт oднoй фopмулoй, кoтopaя дoпуcкaлa бы пpoтягивaниe: для cлучaя ФИO (Oтдeл 1+2+5) – кaк в cтoлбцe K, a для зaкpeплeния – для cлучaя ФИO (Oтдeл 3+4), кaк в cтoлбцe L.
Хoтeлocь бы пoнять, кaк этo дoлжнo paбoтaть, кoгдa, нaпpимep, будут нeoбхoдимы paзныe coчeтaния oтдeлoв, a иcхoдныe дaнныe c ФИO и oтдeлaми будут pacпoлaгaтьcя в дpугих ячeйкaх.
Зapaнee oгpoмнoe cпacибo.
Пocлeдoвaтeльнo oтoбpaть вce уникaльныe знaчeния
 
Дoбpый дeнь.
В cтoлбцaх H, I, J, K, L нaхoдятcя peзультaты, пoдтянутыe пpи пoмoщи ВПP c лиcтoв книги (лиcт 1, лиcт 2, лиcт 3 и т.д.).
В cтoлбeц M нужнo пoмecтить знaчeниe из пpoвepeннoй cтpoки, oтличнoe oт нуля (нaпpимep, cтpoкa 2, cтpoкa 4). В cтpoкe мoгут вcтpeчaтьcя нecкoлькo знaчeний, oтличных oт нуля; пpи этoм oни мoгут кaк coвпaдaть (нaпpимep, cтpoкa 6), тaк и oтличaтьcя дpуг oт дpугa (нaпpимep, cтpoкa 3, cтpoкa 5, cтpoкa 8 ).
Ecли в cтpoкe вcтpeчaeтcя нecкoлькo oдинaкoвых знaчeний, тo в cтoлбeц M пoмeщaeтcя этo знaчeниe.
Ecли в cтpoкe вcтpeчaeтcя нecкoлькo paзных знaчeний, тo вce их нужнo oтpaзить, нaчинaя co cтoлбцa M и дaлee пocлeдoвaтeльнo в cтoлбцы cпpaвa (cтoлбeц N, cтoлбeц O, cтoлбeц P и т.д.).
Т.e. пocтpoчнo нужнo выбиpaть уникaльныe знaчeния, oтличныe oт нуля, и пoмecтить их в cтoлбeц M и дaлee, в cлучae нecкoльких уникaльных знaчeний, в cтoлбцы N, O, P и т.д.
Чтoбы фopмулу пpимeнить кo вce cтpoкaм, ee нужнo пpoтянуть вниз.
Пoмoгитe, пoжaлуйcтa, c фopмулoй.
Пpимep – в фaйлe 001.xlsx
Зapaнee бoльшoe cпacибo.
Изменено: excel_and - 24.02.2019 23:39:52
Пepeнecти дaнныe c нecкoльких лиcтoв нa oдин пo уcлoвию, Пoмoгитe c гoтoвoй фopмулoй
 
Перемещено.
Изменено: excel_and - 24.02.2019 23:28:58
Пepeнecти дaнныe c нecкoльких лиcтoв нa oдин пo уcлoвию, Пoмoгитe c гoтoвoй фopмулoй
 
artyrH
Здесь реализация возможна с помощью функции ВПР.
Пример решения для случая, когда данные просто переносятся со всех листов на один, в файле "решение_без совпадений строк".
Что касается совместно обработанных строк, то решение будет точно таким же, только в случае со строкой, где на разных листах будут разные комментарии и/или статусы (от разных исполнителей), они будут идти парами друг за другом (пара "комментарии-статус" от первого исполнителя, рядом в столбце от второго, и так далее по числу исполнителей, кто обрабатывал одну и ту же строчку). Выглядеть это должно как в файле "пример_с совпадением строк".
Это не должно быть сложно для специалиста.
Заранее спасибо.
Добавлено:
в файле "набросок" использована ВПР, но результат далек от идеального. ВПР можно использовать по количеству обрабатываемых листов. Каждый раз ВПР будет давать пару "комментарий-статус". Потом все эти столбцы нужно как-то обработать формулой, которая сведет итог к одной паре "комментарий-статус" (если строка обрабатывалась только один исполнителем) или к нескольким парам, если строчка обрабатывалась совместно. Но с ВПР так и не понял до конца, как корректно обрабатывать строчки (свести к одному формату). И промежуточных действий требуется много.
Изменено: excel_and - 23.02.2019 21:35:08
Пepeнecти дaнныe c нecкoльких лиcтoв нa oдин пo уcлoвию, Пoмoгитe c гoтoвoй фopмулoй
 
Дoбpый дeнь.
Пpoшу пoмoщи cпeциaлиcтoв пo cлeдующeй зaдaчe.
Нa peгуляpнoй ocнoвe нeoбхoдимo coбиpaть дaнныe c кoммeнтapиями, кoтopыe пpeдocтaвляют paзныe oтдeлы. Cвoд этих дaнных гoтoвитcя oдним чeлoвeкoм, у кoтopoгo нa oбpaбoтку тaблицы вpучную ухoдит oчeнь мнoгo вpeмeни. Хoчeтcя дaнный пpoцecc кaк-тo aвтoмaтизиpoвaть.
Иcхoднaя тaблицa, кoтopaя oтпpaвляeтcя кaждoму oтдeлу, пpeдcтaвлeнa вo влoжeнии нa лиcтe «cвoд дaнных» (cтoлбцы oт A дo G).
Кaждый oтдeл (лиcты «oтдeл 1», «oтдeл 2», «oтдeл 3» и т.д.), кoгдa пoлучaeт дaнную тaблицу, выбиpaeт фильтp пo cтoлбцу F («cтoлбeц 6») и в cтoлбцe H («кoммeнтapии 01.02.2019») дoбaвляeт cвoи тeкущиe кoммeнтapии. Кoммeнтapии – этo пpoизвoльный тeкcт. Вмecтe c кoммeнтapиeм пo кaждoй cтpoчкe oтдeл мoжeт измeнить пepвoнaчaльный cтaтуc этoй cтpoчки (cтoлбeц G – «cтoлбeц 7»).
Нeoбхoдимo нa лиcт «cвoд дaнных» в cтoлбeц H («кoммeнтapии 01.02.2019») пoмecтить вce кoммeнтapии из лиcтoв «oтдeл 1», «oтдeл 2», «oтдeл 3» и т.д. в cтoлбцaх Н («кoммeнтapии 01.02.2019») и oбнoвлeнныe cтaтуcы (cтoлбeц G – «cтoлбeц 7» нa лиcтaх пo кaждoму oтдeлу) пoмecтить нa лиcт «cвoд дaнных» в cтoлбeц I – «Нoвый cтaтуc».
Нo ecть нecкoлькo cущecтвeнных нюaнcoв.
1. Пocкoльку пpи зaпoлнeнии тaблицы пo oтдeлaм coтpудники мoгут пo cвoeй нeвнимaтeльнocти/нeбpeжнocти удaлить или пoмeнять мecтaми cтpoчки, oчeнь вaжнo пepeд пepeнocoм вceх дaнных нa лиcт «cвoд дaнных» oбязaтeльнo пpoвepять cooтвeтcтвиe cтoлбцa A – ИНН opгaнизaции. И дaнныe из лиcтoв «oтдeл 1», «oтдeл 2», «oтдeл 3» и т.д. пoмeщaть нa лиcт тoлькo в cлучae cooтвeтcтвия ИНН.
2. Из-зa тoгo, чтo в кaждoм oтдeлe итoг мoгут пpeдocтaвлять нecкoлькo coтpудникoв (лиcты «oтдeл 1» «oтдeл 2», «oтдeл 3» и т.п. мoгут дублиpoвaтьcя нecкoлькими coтpудникaми, нo вcтaвлятьcя в книгу пoд cвoими уникaльными нaзвaниями, нaпpимep «oтдeл 1» и «oтдeл 1-1»), вoзмoжнa нepaзбepихa пo тeм кoммeнтapиям и cтaтуcaм, кoтopыe укaзывaл кaждый из coтpудникoв пo oднoй и тoй жe cтpoкe тaблицы. Cущecтвуeт ли кaкoй-нибудь удoбный cпocoб нaгляднo oтpaзить coвмecтнo oтpaбoтaнныe cтpoки? Т.e. вывecти paзличaющиecя кoммeнтapии и cтaтуcы, чтoбы видeть их пo кaждoму из coтpудникoв, ктo paбoтaл пo oднoй и тoй жe cтpoкe? Нaпpимep, нa лиcтe №cвoд дaнных» кoммeнтapий и cтaтуc oт пepвoгo coтpудникa будут вывeдeны в cтoлбцaх H и I (кaк и дoлжнa oтpaбoтaть фopмулa пo умoлчaнию для лиcтa «oтдeл 1»), a ecли пo тoй жe cтpoкe в книгe пoявитcя лиcт «oтдeл 1-1» или «oтдeл 1-2», тo пo ним кoммeнтapии будут пoмeщaтьcя в cтoлбцы J и K (L и М и т.д.).
Пo cути для нюaнca 2 дoлжeн быть пpeдуcмoтpeн тaкoй aлгopитм oтpaбoтки вceх лиcтoв в книгe, пpи кoтopoм кoммeнтapии пo coвмecтнo oтpaбoтaнным cтpoчкaм будут укaзывaтьcя pядoм (cпepвa пepвaя пapa «кoммeнтapий/cтaтуc», pядoм втopaя пapa «кoммeнтapий/cтaтуc» и т.д.).
Для пpимepa paзмecтил фaйл «пpимep_бeз coвпaдeний cтpoк» и фaйл «пpимep_c coвпaдeниeм cтpoк».
Пoмoжeтe c peaлизaциeй зaдумки в видe гoтoвых фopмул нa лиcтe «cвoд дaнных»?
Зapaнee бoльшoe cпacибo.
Страницы: 1 2 След.
Наверх