![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Добрый день ! Подскажите пожалуйста такой момент, есть текстовый файл, в нем кол-во строк не постоянное, в него могут вноситься правки, следовательно по номеру строки с начала документа не возможно отследить нужную строку. В конце этого файла, а именно 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
|
||||
|
||||
|
Цитата:
|
|
#3
|
|||
|
|||
|
Код для примера можете показать?
|
|
#4
|
||||
|
||||
|
Цитата:
Код:
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
|
|||
|
|||
|
Спасибо за код, именно то что надо
можно еще вопрос к вам: Есть 12 файлов в каталоге, имена у всех разные. Как можно изменить значения через stringlist у них так, чтобы в первые 6 файлов добавить одно значение, а в другие 6 - другое? т.к. имена разные и меняются, по имени файла их разделить не получится, надо как то в массиве чтоли... |
|
#6
|
||||
|
||||
|
Предположим что в 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
|
|||
|
|||
|
Файлы имеют имя вида:
Autoload_20140415_000000 Autoload_20140415_003000 Autoload_20140415_010000 Autoload_20140415_013000 - постоянное только время, с шагом в пол часа, дата меняется каждый день. Если брать по времени в имени файла, то первые 24 файла - равны 12 часам суток(с 000000 до 1130000), вторые 24 - вторым 12 часам суток (с 120000 до 233000). |
|
#8
|
||||
|
||||
|
наблюдается отличие - у файла начала часа и второй его половины
Цитата:
|
|
#9
|
|||
|
|||
|
да, различие только во времени. время с шагом в полчаса.
И еще нюанс, вот найдены первые 24 файла, действие над ними тоже разные в зависимости от времени. Пример: в файле с временем 000000 надо изменить первую строку, в файле с именем 003000 изменить вторую, потом в файле с именем 010000 изменить первую, в 013000 -вторую и т.д. т.е. получается что файлы являющиеся половиной часа - там изменения в другой строке делаются, в отличие от целочасовых файлов - это как то описать можно ? |
|
#10
|
||||
|
||||
|
т.е. получается что изменения во всех файлах за сутки будут отличаться друг-от-друга и ни-какой унификации не предпологается за этот период? Это всё равно возможно
|
|
#11
|
|||
|
|||
|
получается что во всех файлах есть ОДНО значение, которые мне надо изменять, но это значение находится в разных строках, к примеру это значние находится в 5-ой строке снизу в файлах, у которых имя это целые часы (000000, 010000, 020000 и т.д.) и в 7-ой строке в файлах, у которых имя это половина часа (003000, 013000, 023000 и т.д.) - вот мне надо из всех 48 файлов, выделить первые 24 (с 000000 до 113000) и разделив их по целым часам или получасам и изменить значение в разных строках, потом выделить оставшиеся 24 файла и внести изменения в них. Выделение групп их 24 файлов нужно для того что в первой группе файлов значение будет к примеру вчерашний день (date:= now -1) а во второй группе - следующий день (date:= now +1). как то так
надеюсь объяснить смог понятно, если нет - сорри ![]() |
|
#12
|
||||
|
||||
|
Вот так можно пробежаться по всем файлам за сутки
Код:
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;Код:
if Pos(s, FileName) > 0 then // Это нужный файл Последний раз редактировалось Alegun, 15.04.2014 в 06:45. |
|
#13
|
|||
|
|||
|
Не получается у меня заставить работать ваш код
![]() |
|
#15
|
|||
|
|||
|
спасибо, очень помогли
![]() |