Удаление x количества строк из верхней части текстового файла - PullRequest
0 голосов
/ 07 августа 2009

Я пишу приложение, которое будет использовать файл журнала. Что я хочу сделать, так это то, что при запуске приложения оно будет проверять, не превышает ли размер файла журнала определенный размер, и, если это так, удалит количество строк «x» в верхней части файла журнала, чтобы сократить его. Что было бы хорошим способом сделать это? Будет ли проще записать самые последние записи в верхнюю часть файла, а затем удалить из нижней части, когда я удаляю?

Ответы [ 4 ]

1 голос
/ 07 августа 2009

Есть много открытых вопросов-

  1. В какой среде вы находитесь? В Un * x вы могли бы просто 'tail -100 input.txt> trimmed.txt'
  2. Можете ли вы загрузить файл в память или он будет слишком большим?
  3. Можете ли вы использовать промежуточный файл?
  4. Какие языки у вас есть в наличии / с кем вы знакомы?
  5. Как часто вы будете выполнять обрезку? Если вы пишете чаще, чем обрезка, пишите снизу (это быстро) и редко выполняйте дорогостоящую операцию обрезки.

Если у вас есть C, вы можете найти размер файла с помощью fseek(f,0,SEEK_END);long size=ftell(f); (сразу после открытия f).

Если вам нужно обрезать, вы можете fseek(f,size-desired_size,SEEK_SET);, а затем while (fgetc(f)!='\n') {}, что приведет вас к концу линии, которую вы пересекаете.

Затем скопируйте то, что осталось, в новый файл.

1 голос
/ 07 августа 2009

Я бы не убрал определенное количество строк. По сути, вы должны обработать весь файл, если вы делаете это, и это может быть много обработки. Обычная практика - просто свернуть файл журнала (переименовать его в другое, часто просто добавляя дату) и начать заново.

Также имейте в виду, что файл определенного размера не является гарантией того, что в нем есть необходимые строки, в этом случае вы просто переименовываете файл дорогим способом.

Я часто нахожу это полезным, когда запуск приложения начинается также в начале файла.

1 голос
/ 07 августа 2009

Итак, у вас есть файл журнала, назовем его «log.log»

Сначала переместите log.log на log.log.bak. Откройте его для чтения. Читайте построчно, пока не прочитаете x количество строк. Откройте новый файл log.log для записи. Продолжайте читать строки с log.log.bak и для каждой строки запишите их в log.log. Если строк больше нет, закройте log.log и log.log.bak, а затем удалите log.log.bak.

Какой-то псевдокод:

x = number of lines to delete

move log.log to log.log.bak

open log.log.bak for reading
while i have read < x lines
    read a line and throw it away

open log.log for writing
while there are more lines in log.log.bak
    read a line from log.log.bak
    write the line to log.log

close log.log
close log.log.bak

delete log.log.bak
0 голосов
/ 07 августа 2009

Храните несколько файлов журнала File1 - FileN для каждого вида журнала. Заполните файл File1, затем File2 и т. Д., Когда каждый файл проходит некоторый фиксированный размер. Когда вы заполняете FileN, удаляете File1 и начинаете заново (удаляя) и переписывая File1, File2 ...

Это дает вам циклический журнал фиксированного размера.

Примечание: для этого требуется, чтобы вы отслеживали, в какой файл журнала записывается текущий файл. Это может быть сохранено в отдельном файле журнала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...