Имя: Пароль:
1C
 
v8: Как прочитать текстовый файл начиная с конца?
0 ЭЦ
 
01.04.09
20:45
Здравствуйте.
Прошу подсказать, как v8 прочитать текстовый файл начиная с последней строки?
При последовательном доступе похоже читается только с начала.
А другого способа доступа чтото не нашол.
Спасибо
1 Torquader
 
01.04.09
22:02
Прочитать сначала в буфер, а потом уже из буфера - как левая нога пожелает.
2 ЭЦ
 
06.04.09
20:45
В буфер читать не хочу т.к. файл сильно большой.
Хочу сразу читать с конца !
3 Jump
 
06.04.09
20:51
Дык не пихай в буфер сразу весь файл, а только последние строки.
4 ЭЦ
 
06.04.09
20:56
А как же это я туда последние строчки запихну?
5 Jump
 
06.04.09
20:59
(4)Ну к примеру в файле десять строк, читаешь с первой по восьмую в Null, а с восьмой по десятую в буфер.
6 dimoff
 
06.04.09
21:09
Кто ж данные в текстовом файле хранит, чудо?
7 ЭЦ
 
06.04.09
21:51
(5) Это здорово, только не понятно как узнать скока в файле строк.
Его для этого придется сначала весь прочитать
8 ЭЦ
 
06.04.09
21:54
(5) Да и в NULL читать - как то уж больно кондово.
9 sergeante
 
06.04.09
22:26
Где начало того конца, которым оканчивается начало? (с)

А по сути сдаётся мне, что только с помощью WSH
10 sam_sam
 
06.04.09
22:33
Текст = Новый ТекстовыйДокумент;
   Текст.Прочитать("длодло");
   КолечествоСтрок = Текст.КоличествоСтрок();
   Пока КоличестувоСтрок > 0 Цикл
       Сообщить(Текст.ПолучитьСтроку(КоличествоСтрок));
       КоличествоСтрок = КоличествоСтрок - 1;
   КонецЦикла;

зы
программисты нах.
11 ЭЦ
 
06.04.09
22:58
(10) Уважаемый
То что Вы написали, это и есть последовательное чтение файла в буфер
причем именно сначала.
А мы тут думаем как бы прочитать файл сконца.
Бо не раздувать этот буфер и впустую не тратить время на чтение.
12 Jump
 
06.04.09
23:06
(11)Ну сказале же уже, либо WSH, либо последовательное чтение в буфер, чтобы не засорять память ненужные строки находящиеся в начале можно выкидывать.
Ты бы вообще объяснил для чего тебе это нужно, может проще решение есть.
13 sam_sam
 
06.04.09
23:08
(11) Ну, звыняй в 1С такого нету. Чего вы там всегда такое мастерите?
14 sam_sam
 
06.04.09
23:08
(+13) очумелые ручки. :))))
15 H A D G E H O G s
 
06.04.09
23:57
(10) ВОТ!
Ап стену.
Рождаются же программистами.

Возьмите Нетленку. Там. Это. Реализовано.
16 H A D G E H O G s
 
06.04.09
23:59
Объект
Addin.FileStream

Свойства
Позиция
Размер

Процедура/функция
ОкрытьФайл()
ПрочитатьФайл()
17 ЭЦ
 
07.04.09
16:06
(12) Да вот собственно хотелось убедиться, что в 8.1 без использования внешних компонент можно только сначала файл прочитать.
А нужно для того, чтобы шипко длинные файлы обрабатывать т.к. известно, что нужная информация в них чаще находится ближе к концу.
А файлы не мои я их в готовом виде получаю.
18 Живой Ископаемый
 
07.04.09
16:11
а что приходит ? ну, что в этих файлах?
19 Serg_1960
 
07.04.09
16:15
(в качестве бреда) Создаем DBF-файлик, заливаем в него строки текстового файла. После этого можно "читать" как угодно :))
20 H A D G E H O G s
 
07.04.09
16:16
(19) Бред
21 Живой Ископаемый
 
07.04.09
16:18
(19) Берем открываем в ФАРе этот файл по Ф3 - и жмем Контрол+Енд, читаем... Более того, если этот текстовый файл в данный момент пишется, то мы сразу увидим добавляемые строки...
22 H A D G E H O G s
 
07.04.09
16:18
(21) Не факт. Смотря в каком режиме "своместности" был открыт файл.
23 Hard man
 
07.04.09
16:21
(0) Аф_фтар признайся, "Отче наш" хочешь читать?
24 H A D G E H O G s
 
07.04.09
16:28
(23) Британнику. Раздел - благодарности.
25 Hard man
 
07.04.09
16:29
(24) Так не интересно.
26 ЭЦ
 
07.04.09
16:37
ГОСПОДА
В файлах котировки ценных бумаг
Но какое это имеет значение?
27 H A D G E H O G s
 
07.04.09
16:39
(26) Ойк. 500$ и все вам сделаю.
28 Hard man
 
07.04.09
16:40
(26) Как это какое? Попробуй громко и отчётливо читать "Отче наш" встав возле церкви, сразу узнаешь какое.
29 Hard man
 
07.04.09
16:41
+ (28) Задом наперёд конечно читать.
30 hhhh
 
07.04.09
16:41
(26) и что текстовый файл котировки ценных бумаг приближается к 1 ГБ? Это фантастика.
31 Господин ПЖ
 
07.04.09
16:47
текстовой файл по своей сути последовательно пишется и читается. Хотите "произвольный доступ" - пользуйте соответствующие структуры
32 H A D G E H O G s
 
07.04.09
16:48
(31) Что в этом мире не есть "текстовый файл" ? :-)
33 Господин ПЖ
 
07.04.09
16:49
в конце концов забросить с таблицу sql и выбрать нужное. если fso и т.п. - это медленно.
34 Господин ПЖ
 
07.04.09
16:50
(32) ну грубо говоря все состоит из символов. Но txt и mdf+ldf - две большие разницы по возможностям
35 romix
 
модератор
07.04.09
16:52
Книга знаний: Пример чтения и записи текстовых файлов (Scripting.FileSystemObject)

Чтение с конца м.б. придется имитировать через многократное чтение, буферизуя строк по 100. А м.б. там метод seek есть, надо смотреть.
36 romix
 
модератор
07.04.09
16:59
Или можно разрубить на мелкие файлики, только потом не забыть их стереть.
37 Serg_1960
 
07.04.09
17:29
ALL: после прочтения постов, мой вариант (19) мне уже не кажется бредом :)

(36) Ага. Сделать такую мелкую гальотинку и порубить на файлики... авторов :)
38 Господин ПЖ
 
07.04.09
17:32
(37) не бред. Только в dbf будет медленно. Bulk Insert или DTS так просто не обгонишь.
39 Serg_1960
 
07.04.09
17:38
(38) Медленно - согласен. Но пусть сначала автор озвучит сколько строк в его файлике - кроме того что он "сильно большой". А то может быть и не стоит огород городить...
40 Torquader
 
07.04.09
19:56
Scripting.FileSystemObject позволяет пропускать данные (Skip).
Но, чтобы прочитать последнюю строку файла нужно сначала найти разделитель последней и предпоследней строк, а это можно сделать только последовательным чтением файла сначала.
Также хочу заметить, что данная функция честно читает файл по строкам, а не весь сразу в память, чем существенно экономит память и повышает производительность.
Хотя, можно читать файл посимвольно назад.
Для этого можно делать следующее:
Функция ЧитаемФайлВЗад(ИмяФайла)
 FsoObject=new ActiveXObject("Scripting.FileSystemObject");
 Файл=FsoObject.GetFile(ИмяФайла);
 РазмерФайла=Файл.Size;// получили размер файла
 Файл=0;// сбросили ссылку на всякий пожарный
 СтрокаНакопитель="";
 for(ТекущийБайт=1;ТекущийБайт<РазмерФайл;ТекущийБайт++)do
   УказательФайл=FsoObject.OpenTextFile(ИмяФайла,1,false,false);
   // мы открыли файл ИмяФайла
   // для чтения-1
   // не создавать если его нет-false
   // без Unicode-false
   УказательФайл.Skip(РазмерФайла-ТекущийБайт);
   ПрочитанныйБайт=УказательФайл.Read(1);// читаем байт
   КодБайта=Asc(ПрочитанныйБайт);
   // дело в том, что символ 0 передаётся, как строка нулевой длины
   СтрокаНакопитель=СтрокаНакопитель+","+String(КодБайта);
   УказательФайл.Close();// не забываем закрыть файл
   // к сожалению, в системе нет метода Rewind, чтобы вернуться назад
   // теоретически, есть метод Line, возвращающий номер строки
   // но я не уверен, что там будет правильная информация, после Skip
 enddo;
 Message(СтрокаНакопитель);
КонецФункции
41 Torquader
 
07.04.09
19:59
P.S. код писался с лёту, поэтому работоспособность не гарантиую (по крайней мере описание цикла не будет работать ни в одном мне известном языке) - перевод с JavaScript на 1С - сложное дело.