Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Парсинг файлов. TStream.


Caster Troi ©   (2009-12-10 15:45:00) 

Имеется текстовый файл (назовем его файл 1) с содержимым вида:

fsgdf

asasa

gdfg

. . .

rgerg

Пользователь вводит целочисленное значение, например: 2. После этого должны отобраться первые 2 записи из файла 1 (разделителем считать #13#10#13#10#13#10) и сохраниться в файл 2. Затем из файла 1 они должны удалиться. Проблема в том, что нужно сделать данное используя TStream. Не могу сообразить, как в таком случае определить позицию 3-й записи.

В данном случае файл 2 будет вида:

fsgdf

asasa


misha_gr   (2009-12-10 18:52:00) [1]

> При условии что файлы сравнительно невелики по размеру удобным и
> эффективным решением будет использование связки TFileStream и
> TStringStream - тут тебе и стирим и готовый парсер в одном флаконе.

ну, стрим понятно. А готовый парсер там где?

Я бы, в качестве готового парсера предложил бы TString List.

var
 sTextStream: string;
 SL: TStringList;
 iUserInput: integer;

SetLength(sTextStream, Stream.Size);
Stream.ReadBuffer(pointer(sTextStream)^, Stream.Size);
SL.Text := sTextStream;
for i := 1 to iUserInrut do
 SL.Delete(0);
SL.SaveToFile('c:\1.txt');
SL.Text := sTextStream;
while SL.Count > iUserInput do
 SL.Delete(iUserInput);
SL.SaveToFile(c:\2.txt);


Медвежонок Пятачок   (2009-12-10 16:53:00) [2]

оптимально это когда сервер принимая клиентские данные сразу сует их в структуру, целиком предназначенную для следующей отправки ее целиком  куда-то там.


Caster Troi   (2009-12-10 16:39:00) [3]

пока что приходит в голову сделать как-то так:


var
 FS: TFileStream;
 SS: TStringStream;
begin
 FS := TFileStream.Create('d:\Test.txt', fmOpenRead);
 try
   SS := TStringStream.Create('');
   try
     SS.CopyFrom(FS, FS.Size);

     // Copy отобранные записи -> TMemoryStream -> UploadFTP
     // Delete отобранные записи из TStringStream

     FS.CopyFrom(SS, SS.Size);
   finally
     SS.Free;
   end;
 finally
   FS.Free;
 end;
end;


Может можно сделать более оптимально


Сергей М.   (2009-12-10 16:36:00) [4]


> в рамках одного стрима


Никак.
Одним стримом тут не обойдешься.
Да и не стримова это задача - пулять что-то в инет.
Научить его, конечно, можно, только вот зачем ?)


Медвежонок Пятачок   (2009-12-10 16:31:00) [5]

что значит "в рамках одного стрима"?

а в рамках двух-трех стримов значит нет вопросов?


Caster Troi   (2009-12-10 16:29:00) [6]


> сервер открыл файл, прочитал порцию, запулил ее в инет.


и как это сделать в рамках одного стрима?


Медвежонок Пятачок   (2009-12-10 16:22:00) [7]

сначала придумают кривой метод хранения данных и кривую архитектуру, затем решают возникшие вселенские проблемы самими же и созданные


Медвежонок Пятачок   (2009-12-10 16:19:00) [8]

И зачем при этом какое-то копирование туда-сюда?
тем более с каим-то пользовательским вводом?

сервер открыл файл, прочитал порцию, запулил ее в инет.
затем если надо перезаписал файл без отправленного в инет начала.


Caster Troi   (2009-12-10 16:13:00) [9]


> Медвежонок Пятачок ©   (10.12.09 16:05) [3]
> Пользователь вводит целочисленное значение, например: 2.
>  После этого должны отобраться первые 2 записи из файла
> 1 (разделителем считать #13#10#13#10#13#10) и сохраниться
> в файл 2. Затем из файла 1 они должны удалиться. а если
> еще раз и с этим же файлом и введено будет 1?снова отрезать
> начало и вставить в другой файл?а если еще раз?в итоге будет
> файл 2 и пустой файл 1.Это типа такое копирование придумано
> вместо CopyFile?


тут ситуация следующая: каждые 10 минут клиентские приложения отдают содержимое определленного файла серверу (по сокету). Сервер полученное аккумулирует в сводном файле. Через определенное время сервер берет заданное количество записей из сводного файла и отравляет на интернет-сервер, после чего они удаляются из сводного файла.


Медвежонок Пятачок   (2009-12-10 16:08:00) [10]

Пользователь вводит целочисленное значение, например: 2.

ему легче одной кнопкой открыть его в блокноте, зажать шифт и утопить стрелку вниз.
затем в нужный момент сделать CTRL+X


Медвежонок Пятачок   (2009-12-10 16:05:00) [11]

Пользователь вводит целочисленное значение, например: 2. После этого должны отобраться первые 2 записи из файла 1 (разделителем считать #13#10#13#10#13#10) и сохраниться в файл 2. Затем из файла 1 они должны удалиться.

а если еще раз и с этим же файлом и введено будет 1?
снова отрезать начало и вставить в другой файл?

а если еще раз?

в итоге будет файл 2 и пустой файл 1.
Это типа такое копирование придумано вместо CopyFile?


Сергей М.   (2009-12-10 15:59:00) [12]

При условии что файлы сравнительно невелики по размеру удобным и эффективным решением будет использование связки TFileStream и TStringStream - тут тебе и стирим и готовый парсер в одном флаконе.


clickmaker   (2009-12-10 15:49:00) [13]

> как в таком случае определить позицию 3-й записи


> разделителем считать #13#10


Наверх

Титульная страница Поиск, карта сайта Написать письмо