Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 11.04.2014, 09:08
Ahton Ahton вне форума
Прохожий
 
Регистрация: 05.01.2007
Сообщения: 38
Репутация: 10
По умолчанию Изменить n-строку с конца файла

Добрый день ! Подскажите пожалуйста такой момент, есть текстовый файл, в нем кол-во строк не постоянное, в него могут вноситься правки, следовательно по номеру строки с начала документа не возможно отследить нужную строку. В конце этого файла, а именно 10 строк с конца документа - не изменные, и внутри этих строк надо изменить определенный символ, например 5 символов от 3-го символа с начала строки №2 от конца документа

С помощью такого кода
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  f: textfile;
  st: string;
begin
  assignfile(f,'aaa.txt');
  reset(f);
  while not eof(f) do
    readln(f,st);
  closefile(f);

  Label1.Caption:=st;
end;

я могу считать только последнюю строку, а мне надо считать вторую с низа строку и изменить ее. Подскажите как это сделать?
Ответить с цитированием
  #2  
Старый 11.04.2014, 09:17
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Ahton
Подскажите пожалуйста такой момент, есть текстовый файл, в нем кол-во строк не постоянное, в него могут вноситься правки, следовательно по номеру строки с начала документа не возможно отследить нужную строку. В конце этого файла, а именно 10 строк с конца документа - не изменные, и внутри этих строк надо изменить определенный символ, например 5 символов от 3-го символа с начала строки №2 от конца документа
Самый простой вариант - считать весь текстовый файл в TStringList, произвести нужные правки и сохранить.
Ответить с цитированием
  #3  
Старый 11.04.2014, 09:34
Ahton Ahton вне форума
Прохожий
 
Регистрация: 05.01.2007
Сообщения: 38
Репутация: 10
По умолчанию

Код для примера можете показать?
Ответить с цитированием
  #4  
Старый 11.04.2014, 09:42
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Ahton
Код для примера можете показать?
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  sl: TStringList;
  str: String;
begin
  sl := TStringList.Create;
  try
    sl.LoadFromFile('Имя файла'); // Читаем текстовый файл
    if sl.Count >= 2 then // Если в нём не менее двух строк
    begin
      str := sl[sl.Count - 2]; // Считываем вторую снизу строку

      .....; // Производим нужные изменения с этой строкой в переменной str

      sl[sl.Count - 2] := str; // Записываем назад изменённую строку
    end;
    sl.SaveToFile('Имя файла'); // Сохраняем текстовый файл
  finally
    sl.Free;
  end;
end;
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
Ahton (11.04.2014)
  #5  
Старый 15.04.2014, 05:11
Ahton Ahton вне форума
Прохожий
 
Регистрация: 05.01.2007
Сообщения: 38
Репутация: 10
По умолчанию

Спасибо за код, именно то что надо
можно еще вопрос к вам:
Есть 12 файлов в каталоге, имена у всех разные. Как можно изменить значения через stringlist у них так, чтобы в первые 6 файлов добавить одно значение, а в другие 6 - другое? т.к. имена разные и меняются, по имени файла их разделить не получится, надо как то в массиве чтоли...
Ответить с цитированием
  #6  
Старый 15.04.2014, 05:30
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Предположим что в StringList уже находится список из 12-ти имён файлов - 6 верхних одна группа, остальные другая. Тогда
Код:
...
for i:= 0 to 11 {StringList.Count-1}  do
 if i <=5  then 
// или если кол-во файлов не известно то i <= StringList.Count/2
  begin
  s:= StringList.Items[i];
  // здесь обработка файлов из первой группы

  end else 
  begin
  s:= StringList.Items[i];
 // здесь из другой
 
 end;
...
а может есть какие отличия у файлов, может расширение разное или в названии характерные признаки принадлежности к определённой группе?

Последний раз редактировалось Alegun, 15.04.2014 в 05:57.
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
Ahton (15.04.2014)
  #7  
Старый 15.04.2014, 05:37
Ahton Ahton вне форума
Прохожий
 
Регистрация: 05.01.2007
Сообщения: 38
Репутация: 10
По умолчанию

Файлы имеют имя вида:
Autoload_20140415_000000
Autoload_20140415_003000
Autoload_20140415_010000
Autoload_20140415_013000
- постоянное только время, с шагом в пол часа, дата меняется каждый день.
Если брать по времени в имени файла, то первые 24 файла - равны 12 часам суток(с 000000 до 1130000), вторые 24 - вторым 12 часам суток (с 120000 до 233000).
Ответить с цитированием
  #8  
Старый 15.04.2014, 05:43
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

наблюдается отличие - у файла начала часа и второй его половины
Цитата:
000000
003000
если в них надо редактировать разные данные, то это возможно отловить
Ответить с цитированием
  #9  
Старый 15.04.2014, 05:55
Ahton Ahton вне форума
Прохожий
 
Регистрация: 05.01.2007
Сообщения: 38
Репутация: 10
По умолчанию

да, различие только во времени. время с шагом в полчаса.
И еще нюанс, вот найдены первые 24 файла, действие над ними тоже разные в зависимости от времени. Пример: в файле с временем 000000 надо изменить первую строку, в файле с именем 003000 изменить вторую, потом в файле с именем 010000 изменить первую, в 013000 -вторую и т.д. т.е. получается что файлы являющиеся половиной часа - там изменения в другой строке делаются, в отличие от целочасовых файлов - это как то описать можно ?
Ответить с цитированием
  #10  
Старый 15.04.2014, 06:02
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

т.е. получается что изменения во всех файлах за сутки будут отличаться друг-от-друга и ни-какой унификации не предпологается за этот период? Это всё равно возможно
Ответить с цитированием
  #11  
Старый 15.04.2014, 06:15
Ahton Ahton вне форума
Прохожий
 
Регистрация: 05.01.2007
Сообщения: 38
Репутация: 10
По умолчанию

получается что во всех файлах есть ОДНО значение, которые мне надо изменять, но это значение находится в разных строках, к примеру это значние находится в 5-ой строке снизу в файлах, у которых имя это целые часы (000000, 010000, 020000 и т.д.) и в 7-ой строке в файлах, у которых имя это половина часа (003000, 013000, 023000 и т.д.) - вот мне надо из всех 48 файлов, выделить первые 24 (с 000000 до 113000) и разделив их по целым часам или получасам и изменить значение в разных строках, потом выделить оставшиеся 24 файла и внести изменения в них. Выделение групп их 24 файлов нужно для того что в первой группе файлов значение будет к примеру вчерашний день (date:= now -1) а во второй группе - следующий день (date:= now +1). как то так надеюсь объяснить смог понятно, если нет - сорри
Ответить с цитированием
  #12  
Старый 15.04.2014, 06:38
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Вот так можно пробежаться по всем файлам за сутки
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
i,b : integer;
s: string;
begin
Memo1.Clear;

for i := 0 to 23 do
 for b := 0 to 1 do
  begin
   if i <= 9 then s:= '0'+ IntToStr(i) else
                  s:= IntToStr(i);
   if b=0 then s:= '_' + s + '0000' else s:= '_' + s + '3000';
 // 
  
  Memo1.Lines.Add(s);
   
 // вот здесь поиск и обработка

  end;
end;
Мемо для наглядности - туда добавляется идентификационный фрагмент из имени файла ('_000000'...'_233000') и его можно использовать для нахождения нужного для обработки файла посредcтвом поиска данного фрагмента в имени напр.
Код:
if Pos(s, FileName) > 0 then // Это нужный файл

Последний раз редактировалось Alegun, 15.04.2014 в 06:45.
Ответить с цитированием
  #13  
Старый 15.04.2014, 08:58
Ahton Ahton вне форума
Прохожий
 
Регистрация: 05.01.2007
Сообщения: 38
Репутация: 10
По умолчанию

Не получается у меня заставить работать ваш код
Ответить с цитированием
  #14  
Старый 15.04.2014, 10:25
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от Ahton
Не получается у меня заставить работать ваш код
А так?

З.Ы. Упростил

Последний раз редактировалось Alegun, 15.04.2014 в 17:42.
Ответить с цитированием
  #15  
Старый 16.04.2014, 06:39
Ahton Ahton вне форума
Прохожий
 
Регистрация: 05.01.2007
Сообщения: 38
Репутация: 10
По умолчанию

спасибо, очень помогли
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 15:41.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025