Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1259933827
Insor
2009-12-04 16:37
2010.02.07
Где взять компонент TrxTrayIcon отдельно только его?


3-1234507272
matveih1
2009-02-13 09:41
2010.02.07
ibconsvc.exe


15-1259877728
kyn66
2009-12-04 01:02
2010.02.07
Странно ветка исчезла.


15-1259624132
Kerk
2009-12-01 02:35
2010.02.07
Дживс и Вустер


15-1259997701
begin_flasher
2009-12-05 10:21
2010.02.07
Shockwave Flash





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский