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

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

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

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

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

textual
Листинг программы
;; Получить строку из файла
 
(defun get-line (fil buf)
  (let ((stri ""))
    (loop
       (filGetBlo fil buf)
       (when (filEOF fil) (return stri))
       (filSeek fil (- (filLoc fil) 1))
       (let ((sym (blo2fix buf 1 1)))
         (cond ((= sym 13) nil)
               ((= sym 10) (return stri))
               (t (setq stri (strCat stri (strChr sym)))))))))
 
;; Удалить строку с заданным номером
 
(defun del-str (fname n)
  (let ((fil (gensym 'fil))
        (buf (gensym 'buf))
        (b   (gensym 'b))   
        (pIn  0)
        (pOut 0))
    (filOpen fil fname _BINARY_READ_WRITE)
    (bloCreate buf 2)
    (iter (for i from 1 to (- n 1))
       (get-line fil buf))
    (setq pOut (filLOC fil))
    (get-line fil buf)
    (setq pIn (filLOC fil))
    (loop 
       (when (<= (- (filLOF fil) pIn) 2) (return t))
       (filSeek fil pIn)
       (let* ((stri (get-line fil buf))
              (l (strLen stri)))
             (bloCreate b (+ l 2))
             (setq pIn  (filLOC fil))
             (filSeek fil pOut)
             (str2blo b stri 1)
             (fix2blo b 13 (+ l 1) 1)
             (fix2blo b 10 (+ l 2) 1)
             (filPutBlo fil b)
             (setq pOut (filLOC fil))
             (bloDestroy b)))
    (filClose fil)
    (bloDestroy buf)
    '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