Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.02.07;
Скачать: CL | DM;

Вниз

Парсинг файлов. 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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.011 c
3-1234527045
allexxx
2009-02-13 15:10
2010.02.07
mssql 2005 и xml data type


6-1211467897
vav
2008-05-22 18:51
2010.02.07
ActiveForm и TserverSocket


2-1260466717
kuzmi4
2009-12-10 20:38
2010.02.07
Работа с реестрои


4-1228894242
Хмм
2008-12-10 10:30
2010.02.07
Кликер


2-1260540422
roman936
2009-12-11 17:07
2010.02.07
матрица