Удаление из файла - Lisp

Узнай цену своей работы

Формулировка задачи:

Чтобы удалить строку из текстового файла. Есть способ, считывать последовательно из файла до целевой строки, и пропустить её. А результат записать в новый файл. Мне такой способ не нравится, так как размер файла может быть большим. Я ищу как можно удалить строку из исходного файла, быстрее. Может взять другой формат, не текстовый, напрмер .xls, или есть способ проще? А то смотрю библиотеку "buildnode", ничего не могу понять.

Решение задачи: «Удаление из файла»

textual
Листинг программы
  1. ;; Получить строку из файла
  2.  
  3. (defun get-line (fil buf)
  4.   (let ((stri ""))
  5.     (loop
  6.        (filGetBlo fil buf)
  7.        (when (filEOF fil) (return stri))
  8.        (filSeek fil (- (filLoc fil) 1))
  9.        (let ((sym (blo2fix buf 1 1)))
  10.          (cond ((= sym 13) nil)
  11.                ((= sym 10) (return stri))
  12.                (t (setq stri (strCat stri (strChr sym)))))))))
  13.  
  14. ;; Удалить строку с заданным номером
  15.  
  16. (defun del-str (fname n)
  17.   (let ((fil (gensym 'fil))
  18.         (buf (gensym 'buf))
  19.         (b   (gensym 'b))  
  20.         (pIn  0)
  21.         (pOut 0))
  22.     (filOpen fil fname _BINARY_READ_WRITE)
  23.     (bloCreate buf 2)
  24.     (iter (for i from 1 to (- n 1))
  25.        (get-line fil buf))
  26.     (setq pOut (filLOC fil))
  27.     (get-line fil buf)
  28.     (setq pIn (filLOC fil))
  29.     (loop
  30.        (when (<= (- (filLOF fil) pIn) 2) (return t))
  31.        (filSeek fil pIn)
  32.        (let* ((stri (get-line fil buf))
  33.               (l (strLen stri)))
  34.              (bloCreate b (+ l 2))
  35.              (setq pIn  (filLOC fil))
  36.              (filSeek fil pOut)
  37.              (str2blo b stri 1)
  38.              (fix2blo b 13 (+ l 1) 1)
  39.              (fix2blo b 10 (+ l 2) 1)
  40.              (filPutBlo fil b)
  41.              (setq pOut (filLOC fil))
  42.              (bloDestroy b)))
  43.     (filClose fil)
  44.     (bloDestroy buf)
  45.     'OK))

Объяснение кода листинга программы

  1. Получение строки из файла
    • Код открывает файл с помощью функции filOpen и передает имя файла и режим чтения/записи _BINARY_READ_WRITE.
    • Создается буфер обмена с помощью функции bloCreate, которая принимает размер буфера в байтах.
    • Используя цикл for, код читает строки из файла с помощью функции get-line и сохраняет их в буфере обмена.
    • Функция filLoc используется для определения позиции текущей строки в файле.
    • Код проверяет, достигнут ли конец файла, и возвращает строку, если это так.
    • Код использует функцию filSeek, чтобы вернуться к началу строки, и использует цикл while, чтобы обрабатывать строки в буфере обмена.
    • Код проверяет, является ли текущий символ символом новой строки, и если да, то возвращает строку.
    • Код использует функцию strCat, чтобы объединить текущую строку с символом новой строки и строкой, прочитанной из файла.
    • Код использует функцию strChr, чтобы найти символ новой строки в текущей строке.
    • Код использует условный оператор cond, чтобы проверить, является ли текущий символ символом новой строки, и если да, то вернуть строку.
  2. Удаление строки с заданным номером
    • Код открывает файл с помощью функции filOpen и передает имя файла и режим чтения/записи _BINARY_READ_WRITE.
    • Создается буфер обмена с помощью функции bloCreate, которая принимает размер буфера в байтах.
    • Используя цикл for, код читает строки из файла с помощью функции get-line и сохраняет их в буфере обмена.
    • Функция filLoc используется для определения позиции текущей строки в файле.
    • Код проверяет, достигнут ли конец файла, и возвращает строку, если это так.
    • Код использует функцию filSeek, чтобы вернуться к началу строки, и использует цикл while, чтобы обрабатывать строки в буфере обмена.
    • Код проверяет, является ли текущая строка строкой, которую нужно удалить, и если да, то возвращает nil.
    • Код использует функцию bloCreate, чтобы создать новый буфер обмена, который будет использоваться для хранения строк, которые не должны быть удалены.
    • Код использует функцию str2blo, чтобы скопировать строки из старого буфера обмена в новый буфер обмена.
    • Код использует функцию fix2blo, чтобы добавить символы новой строки в новый буфер обмена.
    • Код использует функцию filPutBlo, чтобы записать новый буфер обмена обратно в файл.
    • Код использует функцию bloDestroy, чтобы освободить буферы обмена.
    • Код возвращает OK, чтобы указать, что операция была выполнена успешно.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 3.833 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут