![]() |
|
|
Регистрация | << Правила форума >> | 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
|
|||
|
|||
![]() Не получается у меня заставить работать ваш код
![]() |
#14
|
||||
|
||||
![]() Я не понял Вашего вопроса, но всё же Вам на него отвечу! Последний раз редактировалось Alegun, 15.04.2014 в 17:42. |
#15
|
|||
|
|||
![]() спасибо, очень помогли
![]() |