|
v7: Обработать текстовый файл без расширения "txt" | ☑ | ||
---|---|---|---|---|
0
Venom
25.11.11
✎
12:41
|
При открытии текстового файла без расширения "txt" выскакивает ошибка "Неверное имя файла!". С чем это связанно и как обойти эту проблему?
//====================================================================== Функция ПолучитьДанныеИзФайла(Файл,ИмяКаталога = КаталогСтатистики) Если ФС.СуществуетФайл(ИмяКаталога+Файл)=0 Тогда Сообщить("Внимание! Файла "+ИмяКаталога+Файл+" не существует."); Возврат ""; КонецЕсли; Текст = СоздатьОбъект("Текст"); Текст.Открыть(ИмяКаталога+Файл); КолВоСтр = Текст.КоличествоСтрок(); Для СтрТ=1 По КолВоСтр Цикл Стр = Текст.ПолучитьСтроку(СтрТ); Сообщить(Стр); КонецЦикла; Возврат ""; КонецФункции // ПолучитьДанныеИзФайла |
|||
1
Mikeware
25.11.11
✎
12:43
|
Текст.Открыть(ИмяКаталога+Файл+".");
|
|||
2
zak555
25.11.11
✎
12:44
|
(1) точка зачем ?
|
|||
3
Venom
25.11.11
✎
12:45
|
(1) точки тоже нет, файлы вида:
1 2 305 789632 |
|||
4
Escander
25.11.11
✎
12:45
|
(0) Сделай вывод ИмяКаталога+Файл - а то хз что туда пихаешь
|
|||
5
Venom
25.11.11
✎
12:46
|
Файлов очень много, более 3'000'000
|
|||
6
Venom
25.11.11
✎
12:47
|
(4) Пихается туда всё правильно, перепроверял много раз.
|
|||
7
ptiz
25.11.11
✎
12:47
|
База СМС? :)
|
|||
8
Venom
25.11.11
✎
12:47
|
+(6) ФС.СуществуетФайл(ИмяКаталога+Файл) не ругается
|
|||
9
Venom
25.11.11
✎
12:49
|
Если файл переименовать - добавив расширение .txt - то файл нормально читается
|
|||
10
Escander
25.11.11
✎
12:51
|
(9) а нутро файло точно текст? Нет всяких управляющих символов?
|
|||
11
Venom
25.11.11
✎
12:52
|
(10) точно текст
|
|||
12
Escander
25.11.11
✎
12:54
|
(11) с файловой системой точно всё норм? Кем-то открыт файл в этот момент точно не был?
|
|||
13
aka AMIGO
25.11.11
✎
12:54
|
скопируй куда-нибудь свой файл, присвой расширение тхт, наслаждайся
|
|||
14
Escander
25.11.11
✎
12:55
|
(13) ну как вариант через попытку, не прокатило в лоб - копия и профит!
|
|||
15
aka AMIGO
25.11.11
✎
12:55
|
а исходный не трожь..
|
|||
16
Гость2
25.11.11
✎
12:57
|
А расширение какое?
|
|||
17
Venom
25.11.11
✎
12:59
|
Расширения нет вовсе, и точки тоже нет
|
|||
18
Гость2
25.11.11
✎
13:03
|
В этом твои грабли. Дай любое расширение и будет работать
|
|||
19
Venom
25.11.11
✎
13:05
|
Добавить расширение это на крайний случай.
|
|||
20
Гость2
25.11.11
✎
13:07
|
Не и трахайся дальше :-))
|
|||
21
mishaPH
25.11.11
✎
13:12
|
(19) почему? если определяется (8) то переименуй его и открывай. в чем проблема то
|
|||
22
Venom
25.11.11
✎
13:17
|
Файлов много. Ла так и сделаю, думал может хитрость какая есть
|
|||
23
FN
25.11.11
✎
13:18
|
fso=СоздатьОбъект("Scripting.FileSystemObject");
ссылкаНаФайл=fso.GetFile(ИмяКаталога+Файл); РазмерФайла=ссылкаНаФайл.Size; текФайл=ссылкаНаФайл.OpenAsTextStream(1); Пока текФайл.AtEndOfStream=0 Цикл ТекСтрока=текФайл.ReadLine(); Сообщить(ТекСтрока); КонецЦикла; |
|||
24
kuromanlich
25.11.11
✎
13:19
|
(23) жесто )
|
|||
25
Ткачев
25.11.11
✎
13:19
|
ИмяКаталога = "D:\";
Файл = "Help"; Если ФС.СуществуетФайл(ИмяКаталога+Файл)=0 Тогда Сообщить("Внимание! Файла "+ИмяКаталога+Файл+" не существует."); Возврат; КонецЕсли; ЗагрузитьВнешнююКомпоненту("V7Plus.dll"); Текст = СоздатьОбъект("addIN.V7TextFile"); Текст.ОткрытьФайл(ИмяКаталога + Файл); Текст.ВыбратьСтроки(); Стр=""; Пока Текст.ПрочитатьСтроку(Стр) = 1 Цикл Сообщить(Стр); КонецЦикла; |
|||
26
FN
25.11.11
✎
13:20
|
(24) получше чем (0)
|
|||
27
Venom
25.11.11
✎
13:25
|
(23) (25) Спасибо
|
|||
28
Escander
25.11.11
✎
13:26
|
(27) кста и потом отпишись какой способ быстрее и какой выстреливает лучше (без ошибок)
|
|||
29
Venom
25.11.11
✎
13:29
|
(28) Хорошо
|
|||
30
mishaPH
25.11.11
✎
13:31
|
(22) да ты больше времени потратишь на выяснение что и как чем прибавит к тормозам эта операция
|
|||
31
Venom
25.11.11
✎
13:31
|
+(29) Может ещё сделаю замер с переименованием файлов и Текст = СоздатьОбъект("Текст");
|
|||
32
Ткачев
25.11.11
✎
13:33
|
(28)Тогда ЗагрузитьВнешнююКомпоненту("V7Plus.dll") ПриЗапускеСистемы
а Текст = СоздатьОбъект("addIN.V7TextFile"); ПриОткрытии с Перем Текст; |
|||
33
Venom
25.11.11
✎
13:34
|
(30) у меня "не горит", я делаю с учётом обработки файлов не только сейчас, но и в будущем (когда появятся новые файлы).
|
|||
34
Escander
25.11.11
✎
13:43
|
(31)ок, только не забудь
|
|||
35
FN
25.11.11
✎
13:58
|
(28) а че там мерять? V7TextFile - самый тормозной
Текст и FSO примерно одинаково, но на больших файлах Текст сдохнет, а FSO на размер плевать. |
|||
36
Venom
25.11.11
✎
14:06
|
Могу на вскидку сказать, что FSO зверь. Буду теперь пользоваться им. Спасибо FN
|
|||
37
FN
25.11.11
✎
14:13
|
(36) на мелких файлах Текст может быть и быстрее, так как сразу весь файл в память грузит.
|
|||
38
Venom
25.11.11
✎
14:46
|
Замеры произвёл. При замере обрабатывал 200 файлов (файлы размером от 300 до 45000 байт)
1 способ используя СоздатьОбъект("Текст") с переименованием файла 2 способ используя СоздатьОбъект("Scripting.FileSystemObject") 3 способ используя СоздатьОбъект("addIN.V7TextFile") Результаты: 1 - 214,854892 (из них 0,231959 на переименование) 2 - 184,911083 3 - 121,988587 |
|||
39
Venom
25.11.11
✎
14:47
|
//======================================================================
Процедура ОбработатьФайлСпособ1(Файл) НовНазв = Файл+".txt"; ФС.ПереименоватьФайл(Файл,НовНазв,1); Файл = НовНазв; Текст1.Открыть(ИмяКаталога+Файл); КолВоСтр = Текст1.КоличествоСтрок(); Для СтрТ=1 По КолВоСтр Цикл ТекСтрока = Текст1.ПолучитьСтроку(СтрТ); Сообщить(ТекСтрока); КонецЦикла; КонецПроцедуры // ОбработатьФайлСпособ1 //====================================================================== Процедура ОбработатьФайлСпособ2(Файл) fso=СоздатьОбъект("Scripting.FileSystemObject"); ссылкаНаФайл=fso.GetFile(ИмяКаталога+Файл); РазмерФайла=ссылкаНаФайл.Size; текФайл=ссылкаНаФайл.OpenAsTextStream(1); Пока текФайл.AtEndOfStream=0 Цикл ТекСтрока=текФайл.ReadLine(); Сообщить(ТекСтрока); КонецЦикла; КонецПроцедуры // ОбработатьФайлСпособ2 //====================================================================== Процедура ОбработатьФайлСпособ3(Файл) Текст2.ОткрытьФайл(ИмяКаталога + Файл); Текст2.ВыбратьСтроки(); ТекСтрока=""; Пока Текст2.ПрочитатьСтроку(ТекСтрока) = 1 Цикл Сообщить(ТекСтрока); КонецЦикла; КонецПроцедуры // ОбработатьФайлСпособ3 |
|||
40
Ткачев
25.11.11
✎
14:55
|
(38)Я проиграл ?
|
|||
41
Venom
25.11.11
✎
14:59
|
(40) нет, наоборот
|
|||
42
FN
25.11.11
✎
15:04
|
(39) СоздатьОбъект("Scripting.FileSystemObject"); - нафига в цикле?
РазмерФайла=ссылкаНаФайл.Size; - это тоже лишнее для теста |
|||
43
Venom
25.11.11
✎
15:07
|
(42) хорошо, я подозревал об этом., сейчас замерю заново
|
|||
44
FN
25.11.11
✎
15:09
|
и для чистоты эксперимента убери Сообщить() - а то оно жрет наверное 99% времени
|
|||
45
Venom
25.11.11
✎
15:14
|
Перезамерил 2 способ (изменив по совету из (42))
1 способ используя СоздатьОбъект("Текст") с переименованием файла 2 способ используя СоздатьОбъект("Scripting.FileSystemObject") 3 способ используя СоздатьОбъект("addIN.V7TextFile") Результаты: 1 - 214,854892 (из них 0,231959 на переименование) 2 - 43,552677 3 - 121,988587 На Сообщить() во всех замерах уходит - 0,000151 |
|||
46
1Сергей
25.11.11
✎
15:14
|
(45) а с чего вдруг второй способ так сильно ускорился?
|
|||
47
FN
25.11.11
✎
15:23
|
(46) все правильно
|
|||
48
Venom
25.11.11
✎
15:23
|
(46) Действительно что-то неправильно. Попозже переделаю все замеры.
|
|||
49
Venom
25.11.11
✎
16:08
|
Убрал Сообщить(), результаты значительно изменились.
1 способ используя СоздатьОбъект("Текст") с переименованием файла 2 способ используя СоздатьОбъект("Scripting.FileSystemObject") 3 способ используя СоздатьОбъект("addIN.V7TextFile") Замер проводился по 3 раза, в результат идёт среднее значение. Результаты: 1 0,761471 2 0,525824 3 1,537899 |
|||
50
Venom
25.11.11
✎
16:11
|
//======================================================================
Процедура ОбработатьФайлСпособ1(Файл) НовНазв = Файл+".txt"; ФС.ПереименоватьФайл(Файл,НовНазв,1); Файл = НовНазв; Текст1.Открыть(ИмяКаталога+Файл); КолВоСтр = Текст1.КоличествоСтрок(); Для СтрТ=1 По КолВоСтр Цикл ТекСтрока = Текст1.ПолучитьСтроку(СтрТ); //Сообщить(ТекСтрока); КонецЦикла; КонецПроцедуры // ОбработатьФайлСпособ1 //====================================================================== Процедура ОбработатьФайлСпособ2(Файл) //fso=СоздатьОбъект("Scripting.FileSystemObject"); ссылкаНаФайл=fso.GetFile(ИмяКаталога+Файл); //РазмерФайла=ссылкаНаФайл.Size; текФайл=ссылкаНаФайл.OpenAsTextStream(1); Пока текФайл.AtEndOfStream=0 Цикл ТекСтрока=текФайл.ReadLine(); //Сообщить(ТекСтрока); КонецЦикла; КонецПроцедуры // ОбработатьФайлСпособ2 //====================================================================== Процедура ОбработатьФайлСпособ3(Файл) Текст2.ОткрытьФайл(ИмяКаталога + Файл); Текст2.ВыбратьСтроки(); ТекСтрока=""; Пока Текст2.ПрочитатьСтроку(ТекСтрока) = 1 Цикл //Сообщить(ТекСтрока); КонецЦикла; КонецПроцедуры // ОбработатьФайлСпособ3 |
|||
51
FN
25.11.11
✎
16:38
|
(49) :)
О чем собственно я и писал еще в (35) |
|||
52
Escander
25.11.11
✎
16:56
|
(49)Оч хор! Буду иметь в виду!
Для эксперимента использовались независимые ныборы файлов? Имхо, после первого чтения файлы могут отстаться в кэше |
|||
53
Venom
05.12.11
✎
12:29
|
К вышеупомянутым способам/тестам обработки текстовых файлов добавлю, что у ФСО есть ещё один огромный плюс - "Не забивается оперативная память". Т.е. процесс не доходит до критического значения, после которого выскакивает ошибка с недостатком памяти.
Итак, плюсы использования fso=СоздатьОбъект("Scripting.FileSystemObject"); 1. Высокая скорость чтения текстовых файлов 2. Чтение файлов без зависимости от его расширения 3. Не съедает оперативную память |
|||
54
Ткачев
06.12.11
✎
07:55
|
одынэска как всегда проиграла
|
|||
55
1Сергей
06.12.11
✎
08:15
|
(54) конечно. Ассемблер рулит. надо на нём БД делать
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |