Имя: Пароль:
1C
1С v8
Переход к нужной строке при чтении текстового файла
0 Радим1987
 
23.01.24
09:26
Всем привет. Нужно загрузить данные из текстового файла (csv) в регистр (20 Гб) занимает куча времени примерно 2 недели. Проблема в том что время от времени  1С не доступна (обновление, перезагрузка,...) приходится запустить загрузку повторно, с последней загруженной строки, чтобы найти я просто перебираю (занимает много времени), может есть какой то другой путь? К примеру перейтиКСтроке(),..?

Для Индекс = 1 По ОбщиеПараметры.НачальнаяСтрокаЧтения Цикл 			
   СтрокаФайла = ЗагружаемыйФайл.ПрочитатьСтроку();			
КонецЦикла;



Процедура ЗагрузитьУниверсально
Процедура ЗагрузитьУниверсально(ОбщиеПараметры, ПараметрыОбработкиСтроки = Неопределено)
    
    Обработано = 0;
    СчетчикСтрок = 1;  
    
    СообщитьПрогресс("Загрузка данных", Обработано);
    
    Если Ложь Тогда
        Таблица = Новый ТаблицаЗначений;
    КонецЕсли;     
    
    ЗагружаемыйФайл = Новый ЧтениеТекста(ОбщиеПараметры.ПутьКФайлуЗагрузки);
    
    Если ОбщиеПараметры.НачальнаяСтрокаЧтения <> 0 Тогда
        Для Индекс = 1 По ОбщиеПараметры.НачальнаяСтрокаЧтения Цикл             
            СтрокаФайла = ЗагружаемыйФайл.ПрочитатьСтроку();            
        КонецЦикла;
    Иначе
        СтрокаФайла = ЗагружаемыйФайл.ПрочитатьСтроку(); //пропускаем первую строку
        СтрокаФайла = ЗагружаемыйФайл.ПрочитатьСтроку();
    КонецЕсли;      
    
    ОписаниеПотока = ОписаниеПотока(Новый ТаблицаЗначений, 0, ОбщиеПараметры.ТолькоНовыеЗаписи);
    
    Пока СтрокаФайла <> Неопределено Цикл
        
        Если СчетчикСтрок = ОбщиеПараметры.КоличествоСтрокВТаблицеПотока Тогда              
            
            Таблица.ЗаполнитьЗначения(ТекущаяДата(), "ДатаОбновления");             
            
            ОписаниеПотока.Таблица = Таблица;                 
            ВОчередьОбработкиДанныхПотока(ОписаниеПотока, ОбщиеПараметры);
            Таблица = Неопределено;
            
            Обработано = Обработано + СчетчикСтрок;
            СообщитьПрогресс("Загрузка данных", Обработано);
            
            СчетчикСтрок = 1;              
        КонецЕсли;
        
        Если Таблица = Неопределено Тогда
            
            Таблица = НоваяТаблицаПотока(ОбщиеПараметры.СоответствиеКолонок);
            НоваяСтрокаВТаблицеПотока(ОбщиеПараметры.СоответствиеКолонок, Таблица, СтрокаФайла, ПараметрыОбработкиСтроки);          
            
        Иначе            
            НоваяСтрокаВТаблицеПотока(ОбщиеПараметры.СоответствиеКолонок, Таблица, СтрокаФайла, ПараметрыОбработкиСтроки);             
        КонецЕсли;
        
        СтрокаФайла = ЗагружаемыйФайл.ПрочитатьСтроку();
        СчетчикСтрок = СчетчикСтрок + 1;
        
        Если ОбщиеПараметры.КонечнаяСтрокаЧтения <> 0
            И ОбщиеПараметры.КонечнаяСтрокаЧтения = СчетчикСтрок Тогда
            Прервать;
        КонецЕсли;
        
    КонецЦикла;
    
    Если Таблица <> Неопределено
        И Таблица.Количество() > 0 Тогда
        
        Таблица.ЗаполнитьЗначения(ТекущаяДата(), "ДатаОбновления");
        
        ОписаниеПотока.Таблица = Таблица;
        ВОчередьОбработкиДанныхПотока(ОписаниеПотока, ОбщиеПараметры);
        Таблица = Неопределено;  
        
        Обработано = Обработано + СчетчикСтрок;
        СообщитьПрогресс("Загрузка данных", Обработано);
        
    КонецЕсли;
        
    ЗагружаемыйФайл.Закрыть();
            
КонецПроцедуры
1 Кирпич
 
23.01.24
08:45
раздели файл. накой тебе файл 20 гб
2 kauksi
 
23.01.24
08:50
+(1) и грузи многопоточно
3 Кирпич
 
23.01.24
08:52
можно один раз пройти по файлу и сохранить позиции начала строк в отдельный файл
4 Altone
 
23.01.24
08:59
грузил данные из json, xml
даже большие файлы , хорошо грузились максимум час.

второй вариант - в регистр записывать текущую обрабатываемую строку
при прерывании, начинать считывание с неё а не с первой.
5 Радим1987
 
23.01.24
09:09
(4) И как начать считывание именно из этой строки? для начала как минимум нужно дойти до этой строки
6 Радим1987
 
23.01.24
09:10
В методах чтение текста нет "ПерейтиКСтроку()"
7 1ctube
 
23.01.24
09:16
(5) Наверно имеется ввижу что перед чтением файла считывается инфа из регистра, если она заполнена значит было прерывание и считывать нужно с этой строки
8 Радим1987
 
23.01.24
09:19
(7) Проблема не в том, с какой строки считать, а в том, как быстро перейти до этой строки. К примеру у текстового документа есть метод "ПолучитьСтроку()" но он подходит при открытии все падает.
9 Радим1987
 
23.01.24
09:19
Сейчас я перехожу так

Для Индекс = 1 По ПоследняяСтрока Цикл            
   СтрокаФайла = ЗагружаемыйФайл.ПрочитатьСтроку();            
КонецЦикла;
10 1ctube
 
23.01.24
09:23
(8) Попробуй тогда порциями прочитать
11 Altone
 
23.01.24
09:24
(8) никак
не стоит, изначально выгружать данные в текстовые файлы
в (1) подсказали - разбей на 20 файлов по гигу или на 40 по 500мб

используй другие форматы. избегая, таких гигантских размеров файлы. бей их на кучу более мелких.
12 Altone
 
23.01.24
09:32
(9) а этот метод не подходит ?

Текст = Новый ТекстовыйДокумент;

Текст.Прочитать("C:\Док.txt");

КоличествоСтрок = Текст.КоличествоСтрок();//получаем количество строк

Для Строка = 1 По КоличествоСтрок Цикл

//Получаем строку по номеру

СтрокаДляРазбора = Текст.ПолучитьСтроку(Строка);

//манипуляции со строкой

Сообщить(СтрокаДляРазбора);

КонецЦикла;
13 Волшебник
 
23.01.24
09:33
(12) Тут файл 20 Гб, так что нужно использовать ЧтениеТекста
14 H A D G E H O G s
 
23.01.24
09:51
Регистр сведений, независимый, непериодический.
Измерения - колонки из вашего csv файла, примитивных типов. Строки, даты, числа, булевы. Плюс ресурс -флаг Обработано.

Загружается из csv за полчаса эти ваши 20 гб и даже быстрее.
Как загрузится - пусть его елозит рег задание, которое будет выбирать 10000 записей, которые не обработаны и обрабатывать их в одной транзакции. При большом желании в несколько потоков.
15 d4rkmesa
 
23.01.24
09:49
Как вариант, через bulk insert загрузить в sqllite и далее уже работать с этим источником данных. Можно грузить в 1С, можно - не грузить(если немного потребителей этих данных). )
16 Волшебник
 
23.01.24
09:52
(14) (15) Хорошие варианты
17 Timon1405
 
23.01.24
09:54
(16) можно оффтоп? почему у 14го сообщения в ветке дата 09.51, а у 15го 09.49?
18 Волшебник
 
23.01.24
09:58
(17) Было редактирование сообщения.
19 Радим1987
 
23.01.24
10:30
(14) Хороший вариант

Попробую вариант (14), (позже обработка) и разбиением

Всем спасибо!
20 lodger
 
23.01.24
13:10
рекордсетами и адо нельзя?
https://infostart.ru/1c/articles/1413866/
Закон Брукера: Даже маленькая практика стоит большой теории.