| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > вставка строки в существующий текстовый файл

вставка строки в существующий текстовый файл

Ответ
Поиск в этой теме
Непрочитано 20.06.2008, 12:37 #1
вставка строки в существующий текстовый файл
Victorovich
 
Регистрация: 10.04.2008
Сообщений: 43

ВСЕМ здрасьте !!!

вот в чем вопрос:
есть текстовый файл со след текстом

КАБЕЛЬ//ВВГнг
КМ1//ОП-1//КЛ-1
КМ2//ОП-2//КЛ-1
КМ3//ОП-3//КЛ-1
КМ4//ОП-4//КЛ-1
КАБЕЛЬ//ШВВП
КР1//ОП-1//КЛ-1
КР2//ОП-2//КЛ-1
КР3//ОП-3//КЛ-1
КР4//ОП-4//КЛ-1

НУЖНО вставить строку

КМ5//ОП-5//КЛ-1

между строками

КМ4//ОП-4//КЛ-1

и

КАБЕЛЬ//ШВВП


зранее всем СПАСИБо
Просмотров: 3506
 
Непрочитано 20.06.2008, 13:30
#2
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


Если Лиспом, то только:
- открыть файл на чтение (open ...)
- прочитать построчно весь файл в список (read-line ...)
- закрыть файл (close ...)
- вставить в нужное место новую строку [можно и в процессе чтения сразу в нужное место списка поместить новую строку, можно и потом - вариантов много, в зависимости от логики программы]
- открыть файл на запись (open ...)
- перезаписать исходный файл (write-line ...).
- закрыть файл (close ...)

PS: Можно и сразу читать и писать файлы, но тогда исправленный файл будет с новым именем и его надо будет переименовывать по окончании записи.
Alaspher вне форума  
 
Автор темы   Непрочитано 20.06.2008, 13:32
#3
Victorovich


 
Регистрация: 10.04.2008
Сообщений: 43


да нужно Лиспом
попробую реализовать твой совет
Victorovich вне форума  
 
Непрочитано 20.06.2008, 14:08
#4
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,844


для варианта содержимого файла:
Код:
[Выделить все]
КАБЕЛЬ//ВВГнг
КМ1//ОП-1//КЛ-1
КМ2//ОП-2//КЛ-1
КМ3//ОП-3//КЛ-1
КМ4//ОП-4//КЛ-1
КАБЕЛЬ//ШВВП
КР1//ОП-1//КЛ-1
КР2//ОП-2//КЛ-1
КР3//ОП-3//КЛ-1
КР4//ОП-4//КЛ-1
и вызова
Код:
[Выделить все]
(test "КМ4//ОП-4//КЛ-1" "КАБЕЛЬ//ШВВП" "КМ5//ОП-5//КЛ-1")
код будет примерно таким (один из множества вариантов. Если Alaspher найдет время, у него будет явно код короче):
Код:
[Выделить все]
(defun test (before next add / file handle str lst pos_before pos_next)

  (defun fun_lst-before (lst pos / count res)
    (setq count 0)
    (while (<= count pos)
      (setq res   (cons (nth count lst) res)
            count (1+ count)
            ) ;_ end of setq
      ) ;_ end of while
    (reverse res)
    ) ;_ end of defun

  (defun fun_lst-after (lst pos / count)
    (reverse (fun_lst-before (reverse lst) (- (length lst) pos 1)))
    ) ;_ end of defun

  (if (and (= (type before) 'str)
           (= (type next) 'str)
           (= (type add) 'str)
           (setq file (getfiled "Файл для изменения" "" "" 4))
           ) ;_ end of and
    (progn
      (setq handle (open file "r"))
      (while (setq str (read-line handle))
        (setq lst (cons str lst))
        ) ;_ end of while
      (close handle)
      (setq lst        (reverse lst)
            pos_before (- (length lst) (length (member before lst)))
            pos_next   (- (length lst) (length (member next lst)))
            ) ;_ end of setq
      (if (setq lst (cond
                      ((and (/= pos_before 0)
                            (/= pos_next 0)
                            (= pos_next (1+ pos_before))
                            ) ;_ end of and
                       (append (fun_lst-before lst pos_before)
                               (list add)
                               (fun_lst-after lst pos_next)
                               ) ;_ end of append
                       )
                      ((member before lst)
                       (append (fun_lst-before lst pos_before)
                               (list add)
                               (fun_lst-after lst (1+ pos_before))
                               ) ;_ end of append
                       )
                      ((member next lst)
                       (append (fun_lst-before lst pos_next)
                               (list add)
                               (fun_lst-after lst (1+ pos_next))
                               ) ;_ end of append
                       )
                      ) ;_ end of cond
                ) ;_ end of setq
        (progn
          (setq handle (open file "w"))
          (foreach item lst
            (write-line item handle)
            ) ;_ end of foreach
          (close handle)
          ) ;_ end of progn
        ) ;_ end of if
      ) ;_ end of progn
    ) ;_ end of if
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 20.06.2008, 14:36
#5
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


Что-то у тебя действительно длинновато получилось. Может как-то так сойдёт:
Код:
[Выделить все]
(defun test (before next add / check file handle lst str)
 (if (and (= (type before) (type next) (type add) 'str)
          (setq file (getfiled "Файл для изменения" "" "" 4))
     )
  (progn (setq handle (open file "r"))
         (while (setq str (read-line handle))
          (if (and (= str next) (= before (car lst)))
           (setq lst   (cons add lst)
                 check t
           )
          )
          (setq lst (cons str lst))
         )
         (close handle)
         (if check
          (progn (setq handle (open file "w"))
                 (foreach item (reverse lst) (write-line item handle))
                 (close handle)
          )
         )
  )
 )
)
*только чуть-чуть поправил*

Последний раз редактировалось Alaspher, 20.06.2008 в 14:43.
Alaspher вне форума  
 
Автор темы   Непрочитано 20.06.2008, 15:01
#6
Victorovich


 
Регистрация: 10.04.2008
Сообщений: 43


СУПЕР
спасибо большое Alaspher

все работает, только одной скобки не хватало. класс.

у меня к тебе просьба. т к я юзер и не очень понимаю некоторые моменты, то прошу тебя - Alaspher - как будет время
прокоментируй некоторые позиции:
1) (and (= (type before) (type next) (type add) 'str) ???
'str ???
2) с остальным разберусь после ответов

КАК сделать так чтобы не нужно было указывать пользователю существующий файл через диалоговое окно, а просто указать в программе ПУТЬ к нему и его имя ???
Victorovich вне форума  
 
Непрочитано 20.06.2008, 15:18
#7
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


Ну, вообще, бОльшая часть спасибо - Алексею. Это его код я подредактировал.

Цитата:
Сообщение от Victorovich Посмотреть сообщение
все работает, только одной скобки не хватало. класс.
Вроде все на месте.

Цитата:
Сообщение от Victorovich Посмотреть сообщение
1) (and (= (type before) (type next) (type add) 'str) ???
'str ???
Проверка типов данных - что все переданые аргументы являются строками. В случае, если переданы не строки и если бы не было этой проверки, работа программы могла бы привести к непредсказуемым последствиям.

Цитата:
Сообщение от Victorovich Посмотреть сообщение
КАК сделать так чтобы не нужно было указывать пользователю существующий файл через диалоговое окно, а просто указать в программе ПУТЬ к нему и его имя ???
Ввести 4-ый аргумент, куда передавать имя файла (включая путь), а в этой функции только проверять его наличие.
Код:
[Выделить все]
(defun test (before next add file / check file handle lst str)
 (if (and (= (type before) (type next) (type add) 'str)
          (setq file (findfile file))
     )
...
далее без изменений.

Последний раз редактировалось Alaspher, 20.06.2008 в 15:23.
Alaspher вне форума  
 
Непрочитано 20.06.2008, 15:25
#8
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,844


Alaspher, я просто старался предусмотреть вариант нахождения не только пары элементов перед вставкой и после нее, так и каждого по отдельности
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 20.06.2008, 15:37
#9
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


Хм... А где ты это потом использовал? У тебя вставка происходит только в первом случае обнаружения совпадения условий, а у меня в каждом. Кстати, Victorovich обрати на это внимание - если надо иначе, то код требует небольшой корректировки.
Alaspher вне форума  
 
Непрочитано 20.06.2008, 15:42
#10
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,844


Ээээ... Я, конечно, особо не гонял код - не до того. Но если создается модифицированный lst, то можно и записывать (последний if). Если нет - значит нет. Охотно допускаю, что я запутался
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 20.06.2008, 16:42
#11
Victorovich


 
Регистрация: 10.04.2008
Сообщений: 43


ВСЕХ Вас благодарю за помощь !!!

Очень облегчили работу.
Victorovich вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > вставка строки в существующий текстовый файл

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
запуск программы из AutoCADа kminas Программирование 19 15.06.2012 13:42
AutoCAD 2008 - вставка блоков из файла в файл Vavan Metallist AutoCAD 14 25.05.2009 19:37
Вставка блока из командной строки, но с переопределением. Mikhail AutoCAD 2 25.03.2005 16:34
Можно ли загрузить Template в существующий файл? Mikhail AutoCAD 10 16.11.2004 21:30