Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.03.2011, 19:45   #1
MSD
Пользователь
 
Регистрация: 23.03.2009
Сообщений: 85
По умолчанию Удаление строк по маске

Добрый день уважаемые программисты, появился вопрос помогите пожалуйста разобраться. Работа со строками, есть допустмим для примера Блэклист в формате тхт:
bebo.com
copainsdavant.linternaute.com
facebook.com
facebook.fr
linkedin.com
linkedin.fr
myspace.com
orkut.com
orkut.li
twikeo.com
vkontakte.ru
и так далее.... вобщем строк около 200000))), как сделать так чтобы оставить только домены заканчивающиеся на .ru а остальные и пустые строки удалить? написал код:
Код HTML:
var
  source : TStringList;
  i : integer;
begin
  source := TStringList.Create;
  source.LoadFromFile('domains.txt');
   for i := 1 to source.Count -1 do begin
   if Pos('.ru',source.Strings[i])<>0  then  source.Delete(i);
   source.SaveFromFile('domains.txt');
   end;
end;
но что то не работает, и еще появляется list index out of bounds(число), сам файл остается без изменений... что не так подскажите пожалуйста. Спасибо.
MSD вне форума Ответить с цитированием
Старый 15.03.2011, 20:07   #2
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию

если предполагается "прогулка" по списку с удалением строк, то нужно использовать не for..to..do, а for..downto..do с последнего до первого итема.
list index out of bounds(число) уже предполагает, что Вы обратились по номеру, индекс которого больше количества итемов.
в остальном мысль верна.

правда, удобнее будет такой вариант, когда есть ДВА стрингЛиста. при совпадении условия строка из первого добавляется во второй. второй сохраняется. вот Вам и новый список.
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}

Последний раз редактировалось Johnson; 15.03.2011 в 20:10.
Johnson вне форума Ответить с цитированием
Старый 15.03.2011, 20:14   #3
Alex2391
Пользователь
 
Аватар для Alex2391
 
Регистрация: 31.01.2011
Сообщений: 54
По умолчанию

Код:
source.SaveToFile('domains.txt');
Alex2391 вне форума Ответить с цитированием
Старый 15.03.2011, 20:19   #4
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию

Алекс, Вы не прочитали проблему... ) Ошибка врядли актуальна, ТС скорее всего подправлял код прямо в браузере, потому и ошибся.
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}
Johnson вне форума Ответить с цитированием
Старый 15.03.2011, 22:42   #5
MSD
Пользователь
 
Регистрация: 23.03.2009
Сообщений: 85
По умолчанию

переписал код так.....
Код:
var
  source : TStringList;
  result : TStringList;
  i : integer;
begin
  source := TStringList.Create;
  result := TStringList.Create;
  source.LoadFromFile('domains.txt');
   for i := 0 downto source.Count -1 do begin
   if Pos('.ru',source.Strings[i])<>0  then result.Add(source.Strings[i]);
   result.SaveToFile('domains2.txt');
   end;
end;

end.
но он не работает, ошибка исчезла, спасибо, но файл domains2.txt не появляется и такое чувство что совсем глухо и ни че не происходит, что не так?

________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 16.03.2011 в 08:52.
MSD вне форума Ответить с цитированием
Старый 16.03.2011, 06:55   #6
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

1. В первом варианте ошибка в том, что цикл нужно начинать с 0.

2. В первом варианте ошибка в том, что вы работаете со списком ч/з for
Цитата:
Код:
for i := 0 downto source.Count -1 do begin
но после source.Delete(i) Count становится меньше. Нужен while.

3. И в первом и во втором варианте ошибка в том, что SaveToFile стоит внутри цикла (м/у begin...end).

Я бы сделал так
Код:
var
  source : TStringList;
  i : integer;
begin
  source := TStringList.Create;
  source.LoadFromFile('domains.txt');
  i := 0;
  while i < source.Count do begin
    if Pos ('.ru', source.Strings[i]) = 0 then
      inc(i)
    else
      source.Delete(i);
  end;
  source.SaveFromFile('domains.txt');
end;
Sibedir вне форума Ответить с цитированием
Старый 16.03.2011, 08:23   #7
MSD
Пользователь
 
Регистрация: 23.03.2009
Сообщений: 85
По умолчанию

всем спасибо за помощь, тему можно закрывать.
MSD вне форума Ответить с цитированием
Старый 16.03.2011, 08:57   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Sibedir, отлично. Только "оставить только домены заканчивающиеся на .ru "
т.е. наоборот, надо удалять те, где Pos ('.ru') = 0


но, просто хочу сказать, что если написать правильно, то можно и FOR использовать:

Код:
// вариант с новым списком
var
  source : TStringList;
  result : TStringList;
  i : integer;
begin
  source := TStringList.Create;
  result := TStringList.Create;
  source.LoadFromFile('domains.txt');
  for i := 0 to source.Count -1 do
     if Pos('.ru',source.Strings[i])>0  then 
              result.Add(source.Strings[i]);
   
   result.SaveToFile('domains2.txt');
end;
Код:
// вариант с удалением из исходного списка
var
  source : TStringList;
  i : integer;
begin
  source := TStringList.Create;
  source.LoadFromFile('domains.txt');
  for i := source.Count -1 downto 0  do 
     if Pos('.ru',source.Strings[i])=0  then  source.Delete(i);

  result.SaveToFile('domains2.txt');
end;
и ещё. все предложенные варианты используют Pos('.ru')
это не совсем корректно.
1) не будут обработаны строчки в ВЕРХНЕМ регистре (т.е. домен MAIL.RU будет удалён, как не содержащий '.ru')
2) останутся домены, где домены внутренние начинаются с ru (например, www.ruby.com)

Последний раз редактировалось Serge_Bliznykov; 16.03.2011 в 09:02.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 16.03.2011, 09:27   #9
New man
Форумчанин
 
Регистрация: 24.01.2011
Сообщений: 774
По умолчанию

Код:
// вариант с удалением из исходного списка
var
  source : TStringList;
  i : integer;
begin
  source := TStringList.Create;
  source.LoadFromFile('domains.txt');
  for i := source.Count -1 downto 0  do 
     if Pos('.ru',AnsiLowerCase(source.Strings[i]))=0  then  source.Delete(i);

  result.SaveToFile('domains2.txt');
end;
вот
a.k.a. Angelicos Phosphoros
Мой сайт
New man вне форума Ответить с цитированием
Старый 16.03.2011, 12:38   #10
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию

И ещё... я бы хотел заметить, что хорошим тоном является
Код:
TS.SaveToFile(ExtractFilePath(paramstr(0))+'domain.txt');
в противном случае если сменится текущая директория - то не найдете вы свой файл...
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}
Johnson вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление строк Trimbl Microsoft Office Excel 13 18.10.2010 13:19
удаление по маске Сергей 2289 Microsoft Office Excel 0 01.10.2010 10:07
перенос строк удаление ненужных строк HelperAwM Microsoft Office Excel 5 26.06.2010 18:42
Перемещение и удаление файлов по маске. Putin-mode Помощь студентам 0 04.06.2010 15:39
удаление строк Dime_x Microsoft Office Excel 2 07.10.2008 13:38