![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Парсинг файлов. 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