![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
длина строк в TStringList
gvozdkoff © (2011-12-05 12:40:00)Здравствуйте, уважаемые.
Задача такая:
есть текстовый файл такого вот содержания
#43faec76$GPRMC,181300.000,A,5508.9052,N,06122.6377,E,0.00,231.09,221111,,,A*68
##
#43faec76$GPRMC,181330.000,A,5508.9052,N,06122.6377,E,0.00,231.09,221111,,,A*6B
Кол-во строк может быть равно 1000
Задача:
1. посчитать количество символов в строках (построчно)
2. удалить строки , кол-во символов в которых < 3 (меньше 3).
вот что я делаю
Var
StrList: TStringList;
TempStr: String;
L,i: Integer;
begin
StrList:= TStringList.Create;
try
StrList.LoadFromFile('2.txt');
TempStr:=StrList.CommaText; //либо TempStr:=StrList.Text;
L:=Length(TempStr); // здесь мне подсчитывает все символы в файле
Label2.Caption:= inttostr(StrList.Count);
Label1.Caption:= inttostr(L);
finally
StrList.Free;
если же делаю так
L:=Length(TempStr[1]); // думаю что приписываю 1-ую строку и получу кол-во символов в ней
то результат у меня равен 1, причем всегда називисимо от значения
TempStr[1]
Ну и сам вопрос, как же посчитать кол-во символов в каждой строке?
Большое спасибо за потраченное время.
gvozdkoff (2011-12-05 15:03:00) [1]Урраа !)))
Спасибо Вам огромное!
Омлет (2011-12-05 15:01:00) [2]
StrList.LoadFromFile('2.txt');
for i := StrList.Count - 1 downto 0 do
if Length(StrList[i]) <= 2 then
StrList.Delete(i);
StrList.SaveToFile('2.txt');
Сергей М. (2011-12-05 15:00:00) [3]
StrList.LoadFromFile('2.txt');
StrList.Text := StringReplace(StrList.Text, '##'#13#10, '', [rfReplaceAll]);
StrList.SaveToFile('2.txt');
gvozdkoff (2011-12-05 14:56:00) [4]вот что у меня получилось
Var
StrList: TStringList;
TempStr: String;
L,i: Integer;
begin
StrList:= TStringList.Create;
try
StrList.LoadFromFile('2.txt');
for i := 0 to StrList.Count - 1 do begin
TempStr := StrList.Strings[i];
L := Length(TempStr);
if L=2 then StrList.Delete(i);
StrList.SaveToFile('2.txt');
end;
finally
StrList.Free;
end;
но как и было упомянуто выше , если в файле есть пустые строки, то выходит ошибка, причем если пустая строка в конце файла, то по условию все строки с кол-вом символов < 4 удаляются + ошибка в конце, если же в середине файла пустая строка, то так же по условию все обрабатывается + ощибка, но пустая строка в середине не удаляется
Как бы это исправить ?
Может проверить сначала на наличие пустых строк ?
Сергей М. (2011-12-05 13:30:00) [5]
> Кол-во строк может быть равно 1000
Всего-то 1000 ? Ну это курам на смех...
> как же посчитать кол-во символов в каждой строке?
А ничего считать и не надо.
Грузишь все это хозяйство в стринглист, получаешь всю строку чтением св-ва Text, одним вызовом StringReplace вырезаешь из строки ненужные подстроки и результат вызова StringReplace суешь назад в стринглист записью в св-во Text
RWolf (2011-12-05 13:25:00) [6]
> а что такое AV
Access Violation.
Возникает, в частности, при попытке разыменовать нулевой указатель; в данном случае (TempStr[1]) это произойдёт, если TempStr=''.
gvozdkoff (2011-12-05 13:03:00) [7]
> Anatoly Podgoretsky © (05.12.11 13:00) [7]
>
> > Медвежонок Пятачок © (05.12.11 12:51) [5]
>
> Он еще и AV получит, на пустых строках.
>
>
а что такое AV ?
Вообщем то мне длину строк надо получить лишь для того, чтобы удалить потом строки такого содеожания
##
то есть пустые
Anatoly Podgoretsky (2011-12-05 13:00:00) [8]
> Медвежонок Пятачок © (05.12.11 12:51) [5]
Он еще и AV получит, на пустых строках.
gvozdkoff (2011-12-05 12:58:00) [9]Спасибо вам большое, за подсказку и за критику, так быстро, даже не ожидал
Сейчас буду пробовать
Медвежонок Пятачок (2011-12-05 12:51:00) [10]L:=Length(TempStr[1]); // думаю что приписываю 1-ую строку и получу кол-во символов в ней
А ты не только думай.
Ты еще и проверяй о том ли ты думаешь
ShowMessage(TempStr[1]);
icWasya (2011-12-05 12:46:00) [11]а почему так
L:=Length(TempStr[1]);
а не так
L:=Length(StrList[1]);
Медвежонок Пятачок (2011-12-05 12:43:00) [12]Только это не длина строки.
Это длина первого символа в этой строке.
Ega23 (2011-12-05 12:43:00) [13]
> то результат у меня равен 1, причем всегда називисимо от
> значения
Индексация начинается с нуля.
> Ну и сам вопрос, как же посчитать кол-во символов в каждой
> строке?
for i := 0 to strList.Count - 1 do
ShowMessage(IntToStr(Length(strList[i])));
Медвежонок Пятачок (2011-12-05 12:42:00) [14]то результат у меня равен 1, причем всегда називисимо от значения
Все верно.
Это правильный результат.