![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Поиск заданного фрагмента в файле
Pretender © (2006-04-25 12:13:00)Всем здравствуйте! :)
ПОдскажите, пожалуйста, вот какую вещь: есть текстовый файл, содержащий строки вида
STR00234 6058 1 3 + 04.04.2006Бюро экспертизы проектов и смет
Необходимо организовать по ней поиск заданного значения, как: считать строку, если есть в строке '1' и '3' и '+', то увеличить значения переменных per1, per2, per3 на единицу, считать слледующую строку и т.д. Помогите разобраться, пожалуйста!
Вот что пока получилось:
procedure TForm1.Button1Click(Sender: TObject);
var
F: Textfile;
res, i, KolStr: integer;
answ : word;
mas: array of string[80];
st1: string;
begin
AssignFile(F, fname);
repeat
{$I-}
Reset(F);
{$I+}
res:=IOResult;
if res <> 0
then answ:=MessageDlg('Ошибка открытия '
+ fname + #13 + 'Повторить попытку?',mtWarning,[mbYes, mbNo],0);
until (res= 0) OR (answ = mrNo);
if res <> 0
then exit;
KolStr:=LinesCount(fname); //функция подсчёта количества строк в файле
SetLength(mas, KolStr); //создаю динамический массив
ListBox1.Items.Clear;
for i:=0 to KolStr do begin
Readln(F, St1);
mas[i]:=st1;
ListBox1.Items.Add(StrDosToWin(mas[i]));
end;
Label3.Caption := IntToStr(KolStr);
end;
function StrDosToWin(AString : string) : string;
begin
Result := AString;
OemToChar(Pointer(Result), Pointer(Result));
end;
Надо сказать, что все эти операции с массивом и листбоксом делались для проверки. Вообще же, я хотел разбить строку по элементам и каждый элемент занести в ячейку массива, а уж осуществить выборку по массиву будет проще простого. Вот только не знаю как это сделать, может будут какие предложения?
Джо (2006-04-25 15:26:00) [41]> [10] Pretender © (25.04.06 15:22)
> А если не фиксирована?
Так она фиксирована или нет? Ты уж определись, пожалуйста. Вряд ли кто-то захочет писать тут тебе 15 вариант "на всякий случай" задаром.
Pretender (2006-04-25 15:22:00) [42]А если не фиксирована?
Джо (2006-04-25 15:17:00) [43][8]
> позиции подстрок фиксирована
> обрезать лишний пробелы
Окончательно перешел на турецкий язык, к чему бы это? :*(
Джо (2006-04-25 15:16:00) [44]Если позиции подстрок фиксирована, то можно воспользоваться функцией Copy. Т.е, например, если нужные значения находятся в позициях 1,10,15..., то получить второе значение можно так:
Copy (Исходная_строка,10,5) и обрезать лишний пробелы справа.
Pretender (2006-04-25 15:10:00) [45]
> Каждое поле находится в фиксированной позиции строки?
Вроде бы да. Если смотреть в фаре по F4 (редактирование), то поля фиксированы. Если по тому, как они в листбокс заносятся, то нет. В качестве разделителя выступает пробел, но не один, т.е. где-то один, а где-то нет. Если б мог, что приложил бы сам файл, но не знаю как тут аттачить.
Джо (2006-04-25 14:59:00) [46]Каждое поле находится в фиксированной позиции строки? Или нет? Что выступает в качестве разделителя? Табуляторы или пробелы. В общем, нормально опиши формат файла.
Pretender (2006-04-25 14:56:00) [47]
> for i:=0 to KolStr - 1
Согласен, сейчас попробовал - в листбоксе стало на одну строчку меньше, как в файле :) А по существу?
MBo (2006-04-25 14:45:00) [48]>Не ошибка.
И всё-таки ошибка.
for i:=0 to KolStr - 1
Pretender (2006-04-25 14:35:00) [49]
> а строчка то чем нибудь разделена или фиксированное количество
> символов под каждую позицию определено
Эта строчка выглядит так, как я привёл - разделена пробелами. По идее, наверно, нужно искать пробелы до тех пор, пока не встретится символ, а затем определять длину всего слова, заносить её в массиы и искать дальше. Я правильно думаю?
> Это ошибка. Элементом на 1 меньше...
Не ошибка. В динамических массивах нумерация идет с 0 (если не ошибаюсь). Если поставить 1, то приложение "вылетает".
Johnmen (2006-04-25 13:22:00) [50]
> for i:=0 to KolStr do begin
Это ошибка. Элементом на 1 меньше...
Palladin (2006-04-25 13:14:00) [51]а строчка то чем нибудь разделена или фиксированное количество символов под каждую позицию определено?