Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: Пред. 1 2 3 4 След.
RSS
Поиск в файле csv, не открывая его
 
Цитата
excel_and написал:
Из-за огромного размера нескольких файлов пришлось разбивать их на части, по 500 000 строк (с помощью скрипта, который посоветовал Hugo), что на выходе дало много csv.
Вот это зря, в моем случае, чем больше файл,тем лучше) тестируйте на 10 ГБ.
Так и не понял, что нужно извлечь, поэтому извлекаю всю строку.
Итак, функция "FindInCSV" в категории функций "Bedvit_xll" (не реклама, а старая версия библы, не стал заморачиватся, переименовывать).
На входе путь к файлу и что ищем, на выходе найденная строка.
Работает очень просто, устанавливаем или открываем надстройку xll -  работаем.
Интересно сколько секунд обрабатывает файл в 10 ГБ  - напишите?
В архиве две версии xll под разную разрядность Excel (!) и пример использования функции.
Можно использовать в VBA через Application.Run
Тестируйте.
Изменено: bedvit - 19 Май 2020 23:56:24
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
Андрей 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 Май 2020 00:05:25
 
Цитата
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 ввести код макроса? А как его просмотреть?
Очень познавательный получился тред. Спасибо всем участникам за помощь и рекомендации.
 
Цитата
excel_and написал:
Что мне нужно сделать, чтобы проверить ваш вариант, где присутствует следующий код?
Поставить, например, TablePlus, его триальная версия вполне поддерживает загрузку csv в базу SQLite. Загрузить ваши csv, проиндексировать по 12 столбцу. Поставить драйвер SQLite. Начать изучать SQL.  Ну, и не стесняться спрашивать и yandex и google и bing - смотря что вам ближе.
Изменено: Андрей VG - 20 Май 2020 06:00:42
 
Т.е. в среднем на поиск каждого артикула нужно 3-4 минуты, но может быть и 7, и это только если искать по одному файлу в 10 Гб, а их может быть много...?
Я позже (не факт что сегодня, некогда сейчас) напишу код, который грузит в словарь все артикулы из этих нарезанных 116 где только один столбец (не убивайте их пока, отложите в отдельный каталог) - интересно сколько времени займёт, и сколько памяти сьест. У Вас вроде только 4 гига? Это конечно мало...

P.S. Кстати - пока разбирался как запустить надстройку Виталия (завелось, но я так и не понял где можно видеть само наличие этой надстройки в Экселе) нашёл где/как можно включить наконец эти PQ и DAX! Заработали оба и на 2010 Стандартный (32-разрядная). Извиняюсь если кого ввёл в заблуждение, но честно никак ранее не мог включить...
Изменено: Hugo - 20 Май 2020 10:37:26
 
Цитата
Hugo написал:
ашёл где/как можно включить наконец эти PQ и DAX! Заработали оба и на 2010 Стандартный (32-разрядная). Извиняюсь если кого ввёл в заблуждение, но честно никак ранее не мог включить
Так может и вправду не на каждый Excel 2010 устанавливается PQ.
Цитата
Hugo написал:
как запустить надстройку Виталия
У меня так получилось: Разработчик > Надстройки > Обзор.. и показал в какой папке надстройка  
 
Цитата
Михаил Л написал:
У меня так получилось: Разработчик > Надстройки > Обзор.. и показал в какой папке надстройка
- ага, а как потом её отключить? :)
Я просто кинул файл в каталог автозагрузки Экселя, и заработало. А как не нужно - удалил из каталога.
И нигде в списке надстроек я её не вижу, т.е. из меню не могу включить/отключить.
А эти PQ/DAX как ни банально - включил в Параметры-Надстройки-Управление (внизу выпадающий)-Отключенные объекты. Но ведь ранее или их там не было, или не включались, не помню. Ибо они всюду были видны, но всюду неактивны и не включаемы... Спасибо Виталию! :)
 
Цитата
Hugo написал:
а как потом её отключить?
Там же снять галку, затем из папки, в которой эта надстройка находится, переместить эту надстройку в другую папку. Затем, при попытке в Excel поставить галку, будет предложено удалить надстройку
 
excel_and, Все верно. Функция просматривает csw, с первого символа и далее (построчно). Если находится искомая подстрока (для всей строки). Эта строка выводится, поиск прекращается. По поводу нескольких строк, можно расширить функционал, но нужен ли он?
Посмотрел ваши тайминги, возможно в них ошибка, вы как их считали? возможно у вас был пересчет всех предыдущих функций, до тестируемой.
У меня поиск в csw в 1ГБ (создан по вашему шаблону увеличенным на большее кол-во строк, искомые данные в конце файла) отработал за 9 секунд. Значит на 10 ГБ примерно 90 сек. Тест-файл прилагаю, протестируйте в VBA на вашем файле в 10 ГБ (на одном, а не на 115). Код теста я уже написал, вам нужно только будет изменить путь к вашему файлу и запустить.
Продублирую:
Код
Sub Test()
Dim t#: t = Timer
Debug.Print Application.Run("FindInCSV", "C:\Users\...\Downloads\пример_структуры_1_ГБ.csv", "ASD123FGH456")
Debug.Print "Time, sec: "; Timer - t
End Sub

Hugo, приветствую! Запускается как обычная надстройка (xla, xlam). Открывается или как файл Excel или устанавливается в папку надстроек.
Если установить как надстройку, будет видна в списке надстроек (как и xla, xlam)
Изменено: bedvit - 20 Май 2020 11:26:24
«Бритва Оккама» или «Принцип Калашникова»?
 
Hugo,  что бы отключить, нужно просто снять галку. Михаил Л,  правильно написал.
Если функционал понравится, можно причесать, сделать описание (как в обычных функциях).
Немного матчасти, для тех кто будет пользоваться:  xll - это надстройка написанная на Си\С++, поэтому в проектах VBA она не видна. Но принцип подключения и использования тот же самый. Из минусов - нельзя посмотреть код, если нет знаний реверс-инженеринга. Из плюсов феноминальная скорость работы (напрямую с win, hdd, памятью, с ячейками Excel, без объектной тяжёлой части, что является и в некоторой степени недостатком, в случае работы с объектами Excel) + небольшая плюшка, можно создать свою категорию/и функций, что я и сделал.
Что происходит под капотом:  функция напрямую обращается к hdd, а в идеале ssd (вот здесь реально будет прирост скорости), и читает кусок памяти в виде строки. Потом следующий. Т.е. в оперативке только текущий. Теоритически файл может быть размером с ваш hdd, и много оперативки не потребуется. Далее ищется вхождение строки, если найдено, выводится строка. Файл закрывается. Опять же открыть файл (в данном контексте) это не прочитать его весь, а создать файловый дескриптор и читать нужную область байтов с диска (строку).
«Бритва Оккама» или «Принцип Калашникова»?
 
Т.к. скорость оперативной памяти и процессора выше на порядки, скорости чтения с hdd, все упирается в скорость чтения с вашего диска. Т.е. быстрее можно сделать функцию, только на быстром железе, ну и возможно немного оптимизировать на ассемблере.
Скорость чтения одного и 100 файлов такого же размера, естественно разная. Нужно создать дескриптор на файл, пообщатся с системой, попить чайка. Еще из особенностей функции: в Excel (с 2007 помоему), строка это Юникод (2 байта на символ), а в файле ANSI (1 байт на символ). Мне приходится переводить из одного формата в другой итоговую строку.
«Бритва Оккама» или «Принцип Калашникова»?
 
Всё, заработало :)
Сперва при даблклике на файле FindInCSVx32.xll (как обычно лениво делаем) Эксель пытался открыть, но ругался что там что-то запрещено в настройках, я пытался наладить, но в итоге запускалось только слепо из каталога автозапуска.
Потом обнулил все настройки - теперь можно подключить, отключить, в списке видно, всё ОК.
 
Соорудил тестовый словарь, просьба проверить на тех которые с одним артикулом, для начала штук 10 положите в каталог tmp рядом с этим файлом.
Если всё сработает - можете увеличить дозу :)
Описание там на листе.
Код особо не полировал, собрал из готовых кусков не оптимизируя.
Вторым шагом можно попросить Виталия чтоб написал функцию, которая будет вытягивать указанную строку из указанного файла :)
Учитывая, что названия полных файлов будут как-то коррелировать с этими обрезанными.
Хотя думаю и средствами FSO можно вытянуть строку довольно быстро, учитывая что там всего по 500000 строк.

Посмотрел на свой Эксель и его память - убийство словаря как-то никак на занятой памяти не сказалось, но у меня и нет больших файлов...
 
Цитата
Hugo написал:
попросить Виталия чтоб написал функцию, которая будет вытягивать указанную строку из указанного файла
Можно написать.
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
Андрей VG написал:
Поставить, например,  TablePlus , его триальная версия вполне поддерживает загрузку csv в базу SQLite. Загрузить ваши csv, проиндексировать по 12 столбцу. Поставить драйвер  SQLite . Начать изучать SQL
TablePlus нашел вроде бы полнофункциональный, но еще не ставил. Попробую поэкспериментировать. В т.ч. с другим софтом из комплекта.
Цитата
bedvit написал:
Тест-файл прилагаю, протестируйте в VBA на вашем файле в 10 ГБ (на одном, а не на 115). Код теста я уже написал, вам нужно только будет изменить путь к вашему файлу и запустить.
Код вставил в файл xlsm, предварительно изменив в коде путь к тяжелому файлу и заменив идентификатор, который присутствует в самом конце файла. Запускаю макрос: вижу, что-то происходит, колесико крутится, примерно те же 7 минут. Но когда макрос отрабатывает, то ничего не появляется: ни найденная строка в xlsm-файле, ни счетчик с таймингом. Надстрока xll установлена. Предварительно ее запускал для пущей гарантии. Что я делаю не так?
 
Цитата
excel_and написал:
Что я делаю не так?
см. рис.
Immediate.PNG (67 КБ)
«Бритва Оккама» или «Принцип Калашникова»?
 
Можно вывести на текущий лист. если вам так удобнее:
Код
Sub Test()
Dim t#: t = Timer
[a2] = Application.Run("FindInCSV", "C:\Users\bvv\Downloads\пример_структуры_1_ГБ.csv", "ASD123FGH456")
[a3] = "Time, sec: " & Timer - t
End Sub

7 мин это долго, видимо у вас hdd слабоват (в 5 раз медленнее чем у меня на рабочем, среднем ПК), у вас ноутбук?
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
Hugo написал:
попросить Виталия чтоб написал функцию, которая будет вытягивать указанную строку из указанного файла
Готово. Скорость сопоставима с поиском. 5,2 миллионную строку находит за 8 сек. Это вторая функция в надстройке: GetRowCSV(файл, номер строки-начинается с 1)
GetRowCSV.PNG (13.49 КБ)
«Бритва Оккама» или «Принцип Калашникова»?
 
Значит если использовать предварительную индексацию в словаре - есть смысл файлы разбивать на части.
 
Цитата
bedvit написал:
7 мин это долго, видимо у вас hdd слабоват (в 5 раз медленнее чем у меня на рабочем, среднем ПК), у вас ноутбук?
Попробовал запустить макрос. Все получилось. На идентификаторе в самой последней строке (тот же самый идентификатор, который использовал вчера) таймер показал следующее:
Time, sec:  423,0791015625 = 7,05 мин.

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

Цитата
bedvit написал:
GetRowCSV(файл, номер строки-начинается с 1)
За вторую функцию тоже спасибо.
Если удастся (будет желание) реализовать вывод всех строк по заданным идентификаторам, которые повторяются в файле, это будет вообще инструмент с универсальным функционалом. Т.е. это аналог "живого" автофильтра, который в эксель жутко тормозит на тяжелых файлах с большим числом строк.
Цитата
Hugo написал:
Значит если использовать предварительную индексацию в словаре - есть смысл файлы разбивать на части.
Смысл есть. Ведь есть разные подходы к решению задачи и разные ограничения.
 
excel_and, мой последний файл не смотрели?
https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=message&FID=1&TID=128731&TITLE_SEO=128731-poisk-v-fayle-csv-ne-otkryvaya-ego&MID=1059130#message1059130
 
Цитата
Hugo написал:
мой последний файл не смотрели?
Да, спасибо. Сегодня буду активно тестировать и отпишу результат. Очень любопытно сопоставление производительности разных вариантов решения.
 
Цитата
Hugo написал:
мой последний файл не смотрели?
Протестировал на 10-ти файлах csv, которые до этого получил в результате деления одного файла размером 1,2 Гб на фрагменты по 500 000 строк. Сами 10 "индексных" csv суммарно весят 72,1 Мб. Запустил макрос по индексации и стал ждать. Эксель ушел в даун, по диспетчеру процессов наблюдал, что процесс работает, поскольку по чуть-чуть отжирал память. Но эксель долгое время так и не отвисал. Ничего страшного, я терпеливый :) Когда индексация закончилась, появилось окошко со счетчиком.
Рисунок.
Получилось 5326 сек = 88,76 мин. Это конечно долго.
Но с другой стороны, у данного метода есть несомненный плюс. При вводе идентификатора в поле, мгновенно отображается имя файла и строчка.
Я так понимаю, что "индекс" находится в памяти, пока открыт csv2Dictionary.xls. Об этом сужу по тому, что после сохранения файла (когда индекс был считан), он не ищет по идентификатору, а предлагает пересканировать индекс заново (Словарь пропал, просьба зачитать заново). Результат сканирования как-то сохраняется или находится только в памяти?
Изменено: excel_and - 21 Май 2020 14:38:25
 
У меня 2,5 файла по 500000 строк (последний неполный, всего 28МБ, причём там в строках не только артикулы) сканирует за 7-8 секунд. Если комп не занят другими делами - сейчас открывал хром, так до 25 секунд затянулось.
Но уникальных артикулов/строк всего десяток, так что не совсем корректное сравнение - словарь не нарастает. Но с другой стороны на каждое значение строки в словаре переписывается номер строки для этого значения, так что какая никакая работа делается.
думаю что на 10 файлов / 72 МБ слишком долго полтора часа.
Кстати внизу в статусбаре пишется какую сотню тысяч строк и в каком файле код читает - у меня по файлу счётчик меняется менее чем за секунду, далее чуть дольше проходит смена файла и т.д.
Думаю что у Вас проблема с памятью, наверняка под 100% занята, потому что у меня проц уже древний (индекс производительности Виндовс 6,6), но памяти достаточно.
Индекс конечно в памяти, в том и смысл - чтоб не искать по файлам, а брать сразу информацию "из головы". Можно конечно это всё выгрузить в текстовый файл, или на лист в столбцы, но думаю смысла не особо много, ведь по сути это дубль того, что есть в этих файлах.
Да и какой объём этого файла будет, его открывать и в нём искать будет опять потеря времени на каждом движении...
Попробуйте на какой другой машине, где памяти побольше, загрузить в словарь хотя бы гигабайт, или каких 50-70 файлов, и гляньте сколько памяти съест Эксель.
Как пишут в интернетах - From everything I've ever encountered (and can't seem to find any documentation to contradict this), the dictionary has no implicit upper limit and is only limited by the amount of memory you have available.
Да, словарь может погибнуть если будет сбой в каком другом макросе, а так вроде должен держаться.
Изменено: Hugo - 21 Май 2020 15:36:42
 
Цитата
Hugo написал:
Попробуйте на какой другой машине, где памяти побольше, загрузить в словарь хотя бы гигабайт, или каких 50-70 файлов, и гляньте сколько памяти съест Эксель.
Конечно попробкю в разных вариациях. Меня что смутило: в статус-баре действительно в реальном времени показывается номер строки и файла, с которым макрос работает. И я заметил, что все 10 файлов вроде бы просканированы. А потом опять вижу те же наименования файлов, что и до этого, и они опять перебираются.
 
Сканирует два раза если быстро нажать на кнопку два раза. Т.е. даблкликнуть.
сканирует, рапортует о потраченном времени и пошёл сканировать ещё раз...
И что удивительно - у меня сперва показывает 7 секунд, затем 17 - т.е. суммирует. Magic!
Ранее я такого не замечал, вероятно потому что никогда так не делал, или процессы всегда были быстрые.
Нажмите аккуратно один раз!

P.S.Добавил защиту от этой напасти, замените весь код модуля на этот (ну или добавьте одну строку, там подписано):
Скрытый текст
Изменено: Hugo - 21 Май 2020 21:13:06
 
Тесты в полном разгаре)
Я тоже протестировал свою библу на 3х накопителях:
HDD WDC WD10EACS-00ZJB0  (1000 ГБ, SATA-II)
HDD WDC WD5000AAKX-001CA0  (500 ГБ, 7200 RPM, SATA-III)
SSD KINGSTON SV300S37A120G  (120 ГБ, SATA-III)

Кто выиграет? Ответ под спойлером
Скрытый текст


Цитата
excel_and написал:
Если удастся (будет желание) реализовать вывод всех строк по заданным идентификаторам
Добавил третий параметр в функцию - Разделитель (опциональный), т.е. если не задан - выводится первая найденная строка. Если задан, выводятся все найденные строки, через заданный разделитель.  В качестве разделите можно использовать любой символ Юникода или несколько символов (строку). Я использовал, к примеру, символ перенос строки (код символа = 10).
Пример и надстройки прилагаю.
Изменено: bedvit - 21 Май 2020 23:14:57
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
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 написал:
Добавил третий параметр в функцию - Разделитель (опциональный)
Спасибо. Попробую :)
 
Цитата
bedvit написал:
Для меня стало неожиданностью, что у всех - время было одинаковое. Надо разобраться, в чем может быть причина такого поведения. Узкое место не накопители, шина? ХЗ. Ваши предположения.
Оказалось, можно было еще ускорить. Здесь обсуждения.

Итоговая реализация быстрее исходной до 8 раз!

Особенности реализации:
1.WinAPI: CreateFile + ReadFile
2.Асинхронность в чтения с диска и выполнения рабочего кода.
3.Возможность отключения системного кеширования.
4.Посему чтение блоками, кратно степени двойки - по 16 Мб.(16777216 байт), в большинстве hdd - такого размера свой кеш.
5.Посему адрес принимающего буфера и рабочего выровнен по размеру сектора/страницы - 4096 байт
6.Возможность вывода всех найденных строк или первой найденной (поиск с начала файла)
7.Строка выводится вся, в т.ч. с разделителями.
8.Кодировка csv/txt - ANSI

Функции:
1.GetRowsCountCSVansi(Файл(строка), БезКеширования(0/1)) - возвращает кол-во строк в файле
2.GetRowCSVansi(Файл(строка), ПодстрокаДляПоиска(индекс), БезКеширования(0/1)) - возвращает найденную строку по индексу
3.FindRowsInCSVansi(Файл(строка), ПодстрокаДляПоиска(строка), ВывестиВсеСтроки(0/1), БезКеширования(0/1)) - возвращает найденную строку/строки по искомой подстроке

Итого при документированной скорости чтения SSD - 450 Мб/с, 10 ГБ читается за 22,2 сек, что близко к скорости поиска (25,45 сек. с отключенным кешированием - 40 млн.строк, ищем последнюю). т.е. скорость поиска сравнима со скоростью чтения с носителя.

Код
Sub Test()
[a2] = Application.Run("FindRowsInCSVansi", "C:\CSV_10_GB.csv", "40000000", 1, 0)
End Sub


Описание
Исходники
Изменено: bedvit - 6 Июн 2020 23:34:11
«Бритва Оккама» или «Принцип Калашникова»?
 
господа читаем название темы:
Цитата
excel_and написал:
Поиск в файле csv, не открывая его
все что вы пишите происходит в файле без открытия его?
если вы открываете файл, на хрен все ваши усилия если нужно найти что-то в файле не открывая его?
в 8 раз быстре  в 100 раз быстее, если файл открыли - это уже не вписывается в тех. задание.
почему бы автору честно не написать:
хотите что-то искать в файле не открывая его - ищите сами, не впутывайте нас в эту хрень
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
Страницы: Пред. 1 2 3 4 След.
Читают тему (гостей: 1)
Наверх