Имя: Пароль:
 
1C
 
Поиск в очень большом текстовом файле (1,2 Гб)
0 Бархат
 
02.11.16
16:00
Всем привет.

Подскажите, может мысли есть у кого появятся.
Как поискать в таком текстовом монстре строки. Это перечень недействительных паспортов с РосФинМониторинга. серия и номер. только цифры. Среди них нужно запустить поиск номеров паспортов людей из базы.

При использовании любого объекта, что ТекстовыйДокумент, что ЧтениеФайла увы "Недостаточно памяти". Заносить данные в регистр - гиблое дело, там 2 миллиона строк вроде. Причем файл периодически обновляется на РосФинМоне.

Как в файле строки найти? Кто что подскажет?
1 CodeFinder
 
02.11.16
16:00
cat
2 CodeFinder
 
02.11.16
16:01
cat | grep
3 ptiz
 
02.11.16
16:03
(0) ЧтениеТекста тебя спасет
4 Бархат
 
02.11.16
16:05
ЧтениеТекста, пардон, выше неправильно написал ЧтениеФайла. Оно тоже "Недостаточно памяти"
5 Бархат
 
02.11.16
16:06
что за "cat | grep"?
6 Lexey_
 
02.11.16
16:07
(4) на ЧтениеТекста.ПрочитатьСтроку() недостаточно памяти?
7 ShAV
 
02.11.16
16:07
(0) имхо лучше какую-то бд создать, а уже в ней искать.  Периодически в нее доливать новые данные. Всяко лучше чем по тексту елозить
8 МихаилМ
 
02.11.16
16:07
этот файл 1,2г  , записи одинаковой длинны. текстовый драйвер oledb (ado) kturj легко с ним справится.

если нужно глазиками найти - используйте notepad++
9 Shur1cIT
 
02.11.16
16:09
(0) вот пример посмотри какие условия вожможны наложить, в моём случае просто все выгребал



Функция ПрочитатьCSV(Папка, ИмяФайла, КолПолей)
    // Параметры:
    // "Папка" - путь к файлу без имени файла с завершающим слешем,
    // "ИмяФайла" - имя файла,
    // "КолПолей" - количество колонок (число).
        Текст = "[" + ИмяФайла + "]
    |ColNameHeader=False
    |Format=TabDelimited
    |TextDelimiter ="+Символы.Таб +"
    |CharacterSet=ANSI
    |";
    
        Для ы = 1 По КолПолей Цикл
        Текст = Текст + "Col" + ы + "=Field" + ы + " Text" + Символы.ПС;
    КонецЦикла;
    ТекстДок = Новый ТекстовыйДокумент;
    ТекстДок.УстановитьТекст(Текст);
    ТекстДок.Записать(Папка + "Schema.ini");
    objRec = Новый COMОбъект("ADODB.Recordset");
    strQuery = "SELECT * FROM [" + ИмяФайла + "]";
    strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Папка + ";Extended Properties=""text;""";
    adOpenStatic = 3;
    adLockOptimistic = 3;
    adCmdText = 1;
    ТаблЗнач = Новый ТаблицаЗначений;
    Для ы = 1 По КолПолей Цикл
        ТаблЗнач.Колонки.Добавить();
    КонецЦикла;
    objRec.Open(strQuery, strConn, adOpenStatic, adLockOptimistic, adCmdText);
    КолСтрок = objRec.RecordCount;
    Ном = 1;
    Пока Не objRec.EOF Цикл
        Если Ном % 500 = 0 Тогда
            Состояние(ИмяФайла + " " + Ном + " из " + КолСтрок);
        КонецЕсли;
        НовСтр = ТаблЗнач.Добавить();
        Для i=0 По objRec.Fields.Count-1 Цикл
            НовСтр[i] = Строка(objRec.Fields(i).Value);
        КонецЦикла;
        objRec.MoveNext();
        Ном = Ном + 1;
    КонецЦикла;
    objRec.Close();
    Возврат ТаблЗнач;
10 МихаилМ
 
02.11.16
16:09
+ тас 110 M строк
11 Gary417
 
02.11.16
16:09
(5) cat и grep это консольные утилиты
12 ptiz
 
02.11.16
16:10
(4) Дело не в ЧтенииТекста. Может ты всё прочитанное в таблицу значений сохраняешь?
13 Shur1cIT
 
02.11.16
16:12
(9) в  strQuery = "SELECT * FROM [" + ИмяФайла + "]";
наложи условия и функция вернет  талицу значения с результатом
14 Shur1cIT
 
02.11.16
16:19
(0) а вообще проще в SQL грузануть средствами скуля, а потом от туда запросом так быстрее...
15 Garykom
 
02.11.16
16:23
Речь про "list_of_expired_passports.csv.bz2" ? Грузить его в свою базу (любую), проиндексировать и как сервис юзать.
16 Pav2016
 
02.11.16
16:24
Любым средством, которое не грузит весь файл в память, а умеет читать потоком.
17 Garykom
 
02.11.16
16:25
18 Pav2016
 
02.11.16
16:26
Если это регулярная процедура, то конечно надо написать скриптик ее загрузки  в SQL. И последующего обновления.
19 Бархат
 
02.11.16
16:54
(13) Р А Б О Т А Е Т !!!! :))))  Саш, ЧЕЛОВЕЧЕСКОЕ СПАСИБО! (15) прав, о нём. Грузить его в базу? как то тестил, подождал пару часов, в РС прогрузил тысяч 200-300, а их пару лямов.
(18) не у всех база на скуле. У некоторых файловая. Контор много.

(14) файл периодически перевыпускается РосФинМоном, бабушек учить его в скуль подгружать не резон. 13-й работает и я счастлив.

Еще раз спасибо!
20 vis_tmp
 
02.11.16
17:43
(15)А что это за файл?
21 Garykom
 
02.11.16
17:45