![]() |
|
v8: Посоветуйте быстрый способ загрузить текстовый файл | ☑ | ||
---|---|---|---|---|
0
dineso
24.08.09
✎
23:28
|
Нужно прошерстить текстовый файл в 4 мегабайта и упрятать его содержимое в справочник. Сейчас делаю так:
ИмяФайла = Константы.ФайлИсходник.Получить(); Файл = Новый ТекстовыйДокумент; Файл.Прочитать(ИмяФайла); Текст = Файл.ПолучитьТекст(); // Файл загружен, начали перебор Для Ы = 1 По СтрЧислоСтрок(Текст) Цикл Строка = СтрПолучитьСтроку (Текст, Ы); ПоложитьСтрокуВНужноеМестоСправочника(); КонецЦикла; Существуют ли более быстрые способы? Сейчас загурзка файла занимает 15 минут, даже если я ничего никуда не записываю, а просто перебираю "вхолостую". |
|||
1
Господин ПЖ
24.08.09
✎
23:30
|
fso, ado
|
|||
2
dineso
24.08.09
✎
23:34
|
Спасибо, буду читать про ADO
|
|||
3
dineso
24.08.09
✎
23:52
|
Нашёл вот такой код:
ИмяФайла = Константы.ФайлИсходник.Получить(); fso = СоздатьОбъект("Scripting.FileSystemObject"); file = fso.OpenTextFile(ИмяФайла, 1, 0, 0); Пока file.AtEndOfStream=0 Цикл Строка = file.ReadLine(); МанипуляцииСоСтрокой(); КонецЦикла; file.Close(); Но он, как я понимаю, к семёрке. Есть ли что-нибудь аналогичное в v8? |
|||
4
Лефмихалыч
24.08.09
✎
23:59
|
"СоздатьОбъект" замени на "Новый COMОбъект" и станет для восьмерки
|
|||
5
Лефмихалыч
25.08.09
✎
00:00
|
а еще "file.AtEndOfStream=0" - на "НЕ file.AtEndOfStream"
|
|||
6
dineso
25.08.09
✎
00:03
|
(5) Спасибо! Вместо пятнадцати минут файл теперь проходится примерно за секунду!
|
|||
7
Лефмихалыч
25.08.09
✎
00:04
|
(6) это не я, я тут ни при чем
|
|||
8
dineso
25.08.09
✎
01:24
|
А существует ли аналогичный способ быстро очистить справочник? Сейчас 40 тысяч записей чистятся примерно 30 секунд, вот таким вот образом:
Выборка = Справочники.Книга.ВыбратьИерархически(); НачатьТранзакцию(); Пока Выборка.Следующий() Цикл СправочникОбъект = Выборка.ПолучитьОбъект(); СправочникОбъект.Удалить(); КонецЦикла; ЗафиксироватьТранзакцию(); |
|||
9
Человек на луне
25.08.09
✎
01:39
|
Че то и так чересчур быстро.
|
|||
10
dineso
25.08.09
✎
01:44
|
(9) Получается, более быстрого способа нет? Жалко.
|
|||
11
Шёпот теней
25.08.09
✎
08:35
|
ужжж заодно, поскажите как менять кодировку при чтении файла по методу указанному в (3)+(4) ...
... вот ... |
|||
12
wise
25.08.09
✎
08:46
|
OpenTextFile
Синтаксис: OpenTextFile(<Filename>,<Iomode>,<Create>,<Format>) Назначение: Открывает текстовый файл и возвращает объект "TextStream", указывающий на него. Параметры: <Filename> - строка, путь к файлу. <Iomode> - необязательный, число. Возможные значения: 1 - Открыть файл только для чтения. 2 - Открыть файл для записи. Если файл уже существовал, его содержимое теряется. 8 - Открыть файл для добавления. Если файл уже существовал, информация будет дописываться в конец файла. <Create> - необязательный, булево (число). Создавать файл, если он не существует (True), или нет (False). По умолчанию - False. <Format> - необязательный, число. Возможные значения: -2 - Открыть файл в формате, используемом системой по умолчанию. -1 - Открыть файл в формате Unicode. 0 - Открыть файл в формате ASCII (по умолчанию). Описание: |
|||
13
Шёпот теней
25.08.09
✎
08:47
|
(11)+ попытки писать подобное:
file = fso.OpenTextFile(ИмяФайла, 1, 0, Кодировка);, где Кодировка = 1; 0; -1; -2 - ни к чему не приводят ... ... а так хочется читать в ="UTF-8" ... ... вот .. |
|||
14
Jolly Roger
25.08.09
✎
08:49
|
(0) ЧтениеТекста ?
|
|||
15
Шёпот теней
25.08.09
✎
08:50
|
(12) пробовал и так:
ИмяФайла = Константы.ФайлИсходник.Получить(); fso = Новый COMОбъект ("Scripting.FileSystemObject"); file = fso.GetFile(ИмяФайла); TextStream = file.OpenAsTextStream(1, -1); //file = fso.OpenTextFile(ИмяФайла, 1, , 0); //Пока file.AtEndOfStream=0 Цикл Строка = TextStream.ReadAll(); МанипуляцииСоСтрокой(Строка); //КонецЦикла; TextStream.Close(); ... всЁ хорошо только "абракадабра" ... |
|||
16
smaharbA
25.08.09
✎
08:51
|
ADODB.Stream
|
|||
17
ptiz
25.08.09
✎
08:57
|
(14) похоже, это не модно
|
|||
18
Шёпот теней
25.08.09
✎
08:58
|
(16) ... как в анекдоте: "Ты, не умничай .. ТЫ - рукой покажи! " ...
... подскажите примером, если есть возможность ... ... вот ... |
|||
19
los_hooliganos
25.08.09
✎
08:59
|
(8) Есть
Соединение = Новый COMОбъект("ADODB.Connection"); Соединение.ConnectionString = стрSQLСтрокаСоединения; Соединение.Open(); ТекстЗапроса = " DELETE FROM "+ИмяТаблицыСправочника+; Соединение.Execute(ТекстЗапроса); Соединение.Close(); |
|||
20
smaharbA
25.08.09
✎
08:59
|
(15) но думаю в 8.х можно обойтись своим ТекстЧеготоТам...
|
|||
21
Шёпот теней
25.08.09
✎
09:00
|
типа этого: ...?
var outStreamW = new ActiveXObject("ADODB.Stream"); // Text stream in Unicode charset var outStreamA = new ActiveXObject("ADODB.Stream"); // Text stream in ISO-8859-1 charset outStreamW.Type = 2; outStreamW.Open(); |
|||
22
Шёпот теней
25.08.09
✎
09:02
|
(20) ... спАсибо ... работает ... !!!
|
|||
23
dineso
25.08.09
✎
11:03
|
(19) Это только на SQL будет работать или везде? У меня пишет ошибку:
Переменная не определена (стрSQLСтрокаСоединения) Соединение.ConnectionString = <<?>>стрSQLСтрокаСоединения; |
|||
24
dineso
26.08.09
✎
10:24
|
Всё, разобрался со скоростью. Перетащил данные в регистр сведений, теперь весь регистр очищается за пару секунд.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |