|
Переход к нужной строке при чтении текстового файла | ☑ | ||
---|---|---|---|---|
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/ |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |