![]() |
| ||
|
|
Новости |
Поиск |
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;
Надо сказать, что все эти операции с массивом и листбоксом делались для проверки. Вообще же, я хотел разбить строку по элементам и каждый элемент занести в ячейку массива, а уж осуществить выборку по массиву будет проще простого. Вот только не знаю как это сделать, может будут какие предложения?
Pretender (2006-04-25 19:47:00) [21]А задание такое: есть у меня динамический массив ts[j], который заполняется в цикле и содержит некую последовательность элементов, например, ts['привет','50','пока']. Желаемый результат: сделать так, чтобы в этом массиве искалось строковое значение 50 и по нахождению оного счётчик к увеличивался на единицу, а затем передавался дальше в программу, ну, например, Label1.Caption:=IntToStr(к). Вот что я хочу.
Gydvin (2006-04-25 19:37:00) [22]Сvотрите [28], ненадо кода, только задание и желаемый результат.
зы. Из всего вышеувиденого я увидел только белиберду
Pretender (2006-04-25 19:30:00) [23]
> какое отношение сабж имеет к файлу
Ну это тестовый файл, для проверки. Размер не задаётся, а определяется уже до цикла следующим образом:
KolStr:=LinesCount(fname); //LinesCount-функция высчитывает количество
строк в файле
SetLength(mas,KolStr); //собственно сам массив, размерность 1хKolStr,
вообщем одномерный
> Приведите несколько строчек из файла с выполняемыми условиями
> и не выполняемыми
Я ж привёл выше, if ts[j] = obr, на нём прога и вылетает. Это я таким образом хочу путем сравнения найти в массиве элемент, который совпадает со стринговой переменной obr='50'.
Gydvin (2006-04-25 19:16:00) [24]Ниасилил.
Приведите несколько строчек из файла с выполняемыми условиями и не выполняемыми (соответсвенно указав какие из них какие) и какой необходимо получить результат. А то нифига не понятно
Джо (2006-04-25 19:15:00) [25]Честно говоря, совсем не понял, какое отношение сабж имеет к файлу "с тремя строками - привет, 50 и пока". Ну да ладно.
> mas[i]:=st1;
Ты размер массива задаешь перед циклом?
Pretender (2006-04-25 19:04:00) [26]Вот теперь что я делаю: у меня есть текстовый файл с тремя строками - привет, 50 и пока. Я пытають из массива путём сравнения выявить совпадащие элементы, а затем увеличить счётчик k на единицу. Но программа "вылетает". Что не так? Видно в динамическом массиве что-то не то...
for i:=0 to KolStr do
begin
Readln(F, St1);
mas[i]:=st1;
ts[j]:=TrimRight(Copy(mas[i],1,6));
obr:='50';
if ts[j] = obr
then
k:=k+1
end;
Pretender (2006-04-25 16:31:00) [27]Ясно, я уже из практики понял, что да. Спасибо.
Джо (2006-04-25 16:28:00) [28]> [23] Pretender © (25.04.06 16:23)
> А если, допустим, у меня в одной строке 2 символа, а в следующей
> 1, то ножно указывать максимальное количество (в данном
> случае 2), а где один символ, то там пробел удалится?
Слушай, ну что мы на одном месте топчемся-то? Если что-то непонятно, перечитай ветку еще раз, просто добавить уже нечего, я всё сказал, в том числе и на этот вопрос отвечал, два раза.
Pretender (2006-04-25 16:23:00) [29]А если, допустим, у меня в одной строке 2 символа, а в следующей 1, то ножно указывать максимальное количество (в данном случае 2), а где один символ, то там пробел удалится?
Джо (2006-04-25 16:19:00) [30]> А количество чего (только сильно не пинай :))?
Копируемых символов.
Pretender (2006-04-25 16:17:00) [31]
> У тебя что — справку враги украли? ;)
Эти гады решили поиздеваться - TrimRight там нет, как много чего другого :) А количество чего (только сильно не пинай :))?
Джо (2006-04-25 16:09:00) [32]> что в качестве 3-го рараметра
Количество. У тебя что — справку враги украли? ;)
Pretender (2006-04-25 16:09:00) [33]Джо, сделал ещё такой динамический массив
ts[j]:=TrimRight(Copy(mas[i],10,?));
что-то никак не допру, что в качестве 3-го рараметра указывается, Pos?
Pretender (2006-04-25 15:57:00) [34]Спасибо, сейчас попробую - отпишусь.
Джо (2006-04-25 15:45:00) [35]Сорри, TrimRight.
Джо (2006-04-25 15:44:00) [36]RTrim
Pretender (2006-04-25 15:44:00) [37]
> затем обрезаешь справа пробелы
Если не трудно, то как? Я попробовал считать определённые строки, в разных местах - всё копируется. нормалёк. Я где-то в инете видел эту функцию с обрезкой, но можно здесь привести?
Джо (2006-04-25 15:40:00) [38]Прочитай, пожалуйста, еще раз мой пост [8]. Копируешь, начиная с определенной позиции по следующую позицию (кол-во = след.позиция - пред.позиция), затем обрезаешь справа пробелы.
Pretender (2006-04-25 15:37:00) [39]Так понимаешь, допустим все позиции, допустим, номера продукта, начинаются с одного значения, а длину могут иметь разную. Вот в чём дело. Т.е. получается, что длина у всех позиций не фиксирована, но начинается с определённой пизиции. Простите меня.
Джо (2006-04-25 15:27:00) [40]Добавлю. Перед написанием программы разбора какого-то формата, ВСЕГДА следует досконально изучить входной формат. От и до.