Логотип сайта поддержки пользователей САПРО сайте поддержки пользователей САПР Translate to:

Магия файлов

Приемы добавления и удаления текстовых строк в файлах с помощью AutoLISP

Barry Bowen
CADALYST

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

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

Удаление текстовой строки

Прежде всего нам необходим файл с данными для тестирования. Откроем Notepad и создадим файл с названием TEST.TXT с четырьмя строками текста, первая будет LINE 1, вторая LINE 2, и так далее. Сохраним этот файл в рабочем каталоге AutoCAD чтобы для доступа к нему не нужно было добавлять полный путь. Содержание файла будет следующим:

LINE 1
LINE 2
LINE 3
LINE 4
Далее, мы напишем программу для удаления строки LINE 3 и перемещения строки LINE 4 на ее место:
LINE 1
LINE 2
LINE 4

Как осуществляется это средствами AutoLisp показано в подпрограмме REMTXT.LSP. Создается временный текстовый файл, который содержит все текстовые строки первоначального файла. Делается это так - открывается первоначальный файл и записываются все его строки во временный файл. Далее, открывается оба файла и записываются строки из временного файла назад в первоначальный , до той строки, которую мы хотим удалить. Эта строка пропускается и продолжается запись остальных строк до тех пор пока мы не достигнем конец файла.

;;Remove line of text from external file 
(defun C:REMTXT (/ FILE FILE1 LINE CNT) (if (findfile "TEST.TXT") (progn 
(setq FILE (open "TEST.TXT" "r")) 
(setq FILE1 (open "TEST.TMP" "w")) 
(setq LINE (read-line FILE)) 
(while LINE (write-line LINE FILE1) (setq LINE (read-line FILE)) ) 
(close FILE) (close FILE1) 
(setq FILE (open "TEST.TXT" "w")) 
(setq FILE1 (open "TEST.TMP" "r")) 
(setq LINE (read-line FILE1)) 
(setq CNT 1) 
(while LINE 
(if (/= CNT 3) (write-line LINE FILE)) 
(setq LINE (read-line FILE1)) 
(setq CNT (1+ CNT)) ) 
(close FILE) (close FILE1) 
(alert "File TEST.TXT Updated") ) 
(alert "File TEST.TXT not Found!") )(princ)) 

Файл REMTXT.LSP

Ключевое выражение появляется в втором цикле (while):
(if (/= CNT 3) (write-line LINE FILE))

В этом примере используется счетчик для подсчета строк, записанных в файл, проверяя когда переменная CNT достигает значение 3, то есть той строки, которую не нужно записывать в файл. Вместо этого, подпрограмма читает следующую строку во временном файле и записывает ее вместо третьей строке в первоначальном файле. Подсчет строк в текстовом файле достаточно прост, но что, если Вы хотите заменить определенную строку текста? Достаточно исправить это выражение указав текст, который Вы ищете и удалите счетчик:

(if (/= LINE "LINE 3") (write-line LINE FILE))

Замена текстовой строки

Теперь, когда вы знаете как удалять существующую текстовую строку в файле, посмотрим как можно заменить существующую строку новой строкой. Используя тот же файл как и перед этим, изменим выражение в цикле (while) при использовании счетчика строк следующим образом:

(if (= CNT 3) 
(write-line "THIS IS THE NEW LINE 3 TEXT" FILE) 
(write-line LINE FILE)) 
и следующим образом, когда ищем определенную строку текста:
(if (= LINE "LINE 3") 
(write-line "THIS IS THE NEW LINE 3 TEXT" FILE) 
(write-line LINE FILE)) 

Эти простые примеры чвляются основой для разработки более сложных подпрограмм работы с файлами.



Copyright © Сайт поддержки пользователей САПР by Victor Tkachenko