Форум: "Начинающим";
Текущий архив: 2010.02.07;
Скачать: [xml.tar.bz2];
ВнизПарсинг файлов. TStream. Найти похожие ветки
← →
Caster Troi (2009-12-10 15:45) [0]Имеется текстовый файл (назовем его файл 1) с содержимым вида:
fsgdf
asasa
gdfg
. . .
rgerg
Пользователь вводит целочисленное значение, например: 2. После этого должны отобраться первые 2 записи из файла 1 (разделителем считать #13#10#13#10#13#10) и сохраниться в файл 2. Затем из файла 1 они должны удалиться. Проблема в том, что нужно сделать данное используя TStream. Не могу сообразить, как в таком случае определить позицию 3-й записи.
В данном случае файл 2 будет вида:
fsgdf
asasa
← →
clickmaker © (2009-12-10 15:49) [1]> как в таком случае определить позицию 3-й записи
> разделителем считать #13#10
← →
Сергей М. © (2009-12-10 15:59) [2]При условии что файлы сравнительно невелики по размеру удобным и эффективным решением будет использование связки TFileStream и TStringStream - тут тебе и стирим и готовый парсер в одном флаконе.
← →
Медвежонок Пятачок © (2009-12-10 16:05) [3]Пользователь вводит целочисленное значение, например: 2. После этого должны отобраться первые 2 записи из файла 1 (разделителем считать #13#10#13#10#13#10) и сохраниться в файл 2. Затем из файла 1 они должны удалиться.
а если еще раз и с этим же файлом и введено будет 1?
снова отрезать начало и вставить в другой файл?
а если еще раз?
в итоге будет файл 2 и пустой файл 1.
Это типа такое копирование придумано вместо CopyFile?
← →
Медвежонок Пятачок © (2009-12-10 16:08) [4]Пользователь вводит целочисленное значение, например: 2.
ему легче одной кнопкой открыть его в блокноте, зажать шифт и утопить стрелку вниз.
затем в нужный момент сделать CTRL+X
← →
Caster Troi (2009-12-10 16:13) [5]
> Медвежонок Пятачок © (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:19) [6]И зачем при этом какое-то копирование туда-сюда?
тем более с каим-то пользовательским вводом?
сервер открыл файл, прочитал порцию, запулил ее в инет.
затем если надо перезаписал файл без отправленного в инет начала.
← →
Медвежонок Пятачок © (2009-12-10 16:22) [7]сначала придумают кривой метод хранения данных и кривую архитектуру, затем решают возникшие вселенские проблемы самими же и созданные
← →
Caster Troi (2009-12-10 16:29) [8]
> сервер открыл файл, прочитал порцию, запулил ее в инет.
и как это сделать в рамках одного стрима?
← →
Медвежонок Пятачок © (2009-12-10 16:31) [9]что значит "в рамках одного стрима"?
а в рамках двух-трех стримов значит нет вопросов?
← →
Сергей М. © (2009-12-10 16:36) [10]
> в рамках одного стрима
Никак.
Одним стримом тут не обойдешься.
Да и не стримова это задача - пулять что-то в инет.
Научить его, конечно, можно, только вот зачем ?)
← →
Caster Troi (2009-12-10 16:39) [11]пока что приходит в голову сделать как-то так:
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:53) [12]оптимально это когда сервер принимая клиентские данные сразу сует их в структуру, целиком предназначенную для следующей отправки ее целиком куда-то там.
← →
misha_gr (2009-12-10 18:52) [13]> При условии что файлы сравнительно невелики по размеру удобным и
> эффективным решением будет использование связки 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);
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2010.02.07;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.004 c