С Новым годом! Форум программистов, компьютерный форум, киберфорум
Lisp
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 23.02.2016
Сообщений: 7
1

Почикать символы возврата каретки и перевода строки

27.02.2016, 20:43. Показов 1664. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте!

Вот такой парой функций считываю строки из файла в список:

Lisp
1
2
3
4
5
6
7
8
9
10
(defun add-el (lst el)
   (cond ((null lst) (list el))
      (t (cons (car lst) (add-el (cdr lst) el)))))
 
(defun read-file (filename)
   (setq in-list '())
       (with-open-file (stream filename) 
           (when stream
               (loop for line = (read-line stream nil)
                    while line do (setq in-list (add-el in-list line))))))
Она возвращает список вида:

Lisp
1
("(x (y L) L) (z L) L^M" "x (y L) L^M" "x L y^M")
Как избавиться в каждом элементе списка от литеры ^M ?

P.S. не пинайте сильно, функцию add-el скоммуниздил с этого форума... )))

З.Ы.Ы. не получается сделать в редакторе форума нормальные отступы в теле функций.... (
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.02.2016, 20:43
Ответы с готовыми решениями:

Написать программу удаления из текстового файла символов перевода строки ‘\n’ и перевода каретки ‘\r’
Здравствуйте,помогите написать программу на подобии этой,только не подсчета,а удаления.Заранее...

Сложности с символом возврата каретки
Всем привет! Имеется файл dictionary.txt Его содержимое считывается в массив и делается попытка...

VBScript.RegExp: Символ возврата каретки
Подскажите как в регулярке в замене указать конец абзаца. В строке поиска это \r Но в строке...

Символ возврата каретки при Ajax запросе
Всем добрый день! Может кто сталкивался с ситуацией, когда при Ajax запросе, в ответе приходит...

6
4527 / 3521 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
27.02.2016, 20:48 2
Отступов нет, нечитаемо. Вообще, ^M похоже на рудименты досовского конца строки.
0
84 / 83 / 8
Регистрация: 31.03.2015
Сообщений: 447
27.02.2016, 21:08 3
Bow_Man, Обьясните в чем суть задачи...
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
37413 / 20785 / 4278
Регистрация: 12.02.2012
Сообщений: 34,196
Записей в блоге: 14
27.02.2016, 21:28 4
Bow_Man, что-то ты навертел... Вот:

Lisp
1
2
3
4
5
6
(defun read-from-file (finp)
  (let ((res nil))
       (with-open-file (fi finp)
         (loop  (let ((a (read fi nil 'EOF)))
                     (when (eq a 'EOF) (return res))
                     (setq res (append res (list a))))))))
Файл 111.txt

Код
(a b c)
(1 2 3 4)
(b v b (e r t))
Результат работы:

Lisp
1
2
3
CL-USER 7 > (read-from-file "111.txt")
 
((A B C) (1 2 3 4) (B V B (E R T)))
1
4527 / 3521 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
27.02.2016, 22:21 5
Вообще, отпилить лишние символы можно с помощью функции (string-right-trim "^M" строка).

Замечания по функции read-file

Переменные надо объявлять! Компилятор должен был предупредить, что переменная in-list не определена. Нужно объявить её с помощью let, а setq не нужен.

В with-open-file желательно указать :direction :input для ясности. Если не получается открыть файл, сигнализируется ошибка. В принципе, можно указать другое поведение с помощью аргумента :if-does-not-exist, но в имеющемся виде проверка when stream не имеет смысла.

Что такое add-el, вникать не буду, но предполагаю, что есть соответствующая стандартная функция или клауза loop-а.
1
0 / 0 / 0
Регистрация: 23.02.2016
Сообщений: 7
28.02.2016, 07:12  [ТС] 6
Цитата Сообщение от Vaderkos Посмотреть сообщение
Bow_Man, Обьясните в чем суть задачи...
Хм... Думал в заголовке темы все ясно сказано - удалить из конца строки символы #10 #13 (перевод строки и возврат каретки) - кодировка DOS, cp866, win-1251... кому как удобно...

Добавлено через 2 минуты
Цитата Сообщение от helter Посмотреть сообщение
Отступов нет, нечитаемо. Вообще, ^M похоже на рудименты досовского конца строки.
В заголовке темы так и написано. Рудиментами оно никак не является, это неотъемлемая часть любого текстового файла в дос-кодировке.

Добавлено через 10 минут
Цитата Сообщение от helter Посмотреть сообщение
Вообще, отпилить лишние символы можно с помощью функции (string-right-trim "^M" строка).
Пробовал, не срослось... Наверное, ручки кривые... )

Переменные надо объявлять! Компилятор должен был предупредить, что переменная in-list не определена.
Солгасен!

Нужно объявить её с помощью let, а setq не нужен.
А вот тут есть НО. Переменная объявленная с помощью let в тебе функции только в ней и видна, либо в пределах инструкции let. Или я ошибаюсь? В моем случае потребна глобальная видимость переменной, таким образом, как понимаю, ее необходимо объявить еще до вызова функции read-from-file инструкцией defvar или defparameter?

Ну или либо вызывать функцию конструкцией вида: (setq a (read-from-file "filename.extention"))
0
4527 / 3521 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
28.02.2016, 14:09 7
Цитата Сообщение от Bow_Man Посмотреть сообщение
удалить из конца строки символы #10 #13 (перевод строки и возврат каретки)
Вроде мы там только CR видим, это закономерно. Функция read-line возвращает прочитанную строку без символа перевода (и второе значение — t/nil в зависимости от того, был там перевод строки или нет). Очевидно, ваш лисп воспринимает в качестве знака перевода строки только LF и отпиливает только его. Это немного странно: виндовому лиспу следовало бы сразу знать из CR+LF; а невиндовому, возможно, лучше указать кодировку?

Цитата Сообщение от Bow_Man Посмотреть сообщение
Пробовал, не срослось... Наверное, ручки кривые... )
Попробуйте ещё раз, у меня работает. У вас редактор точно CR вставил в первый аргумент функции string-right-trim? Может, попробовать ещё скопировать оттуда, где он точно есть?

Цитата Сообщение от Bow_Man Посмотреть сообщение
Переменная объявленная с помощью let в тебе функции только в ней и видна, либо в пределах инструкции let. Или я ошибаюсь? В моем случае потребна глобальная видимость переменной, таким образом, как понимаю, ее необходимо объявить еще до вызова функции read-from-file инструкцией defvar или defparameter?
Да, let — локальная лексическая, а defvar и defparameter — глобальные динамические. Я что-то не подумал, что вы глобальную переменную будете использовать. Вы точно знаете, что делаете? Было бы естественнее, если бы функция read-from-file возвращала список, как вы потом пишете. Только его нужно вернуть: в нынешнем виде loop возвращает nil, можно после него написать in-list, чтобы вернулось значение этой переменной. С помощью loop можно короче:
Lisp
1
2
3
4
(loop
   for line = (read-line stream nil)
   while line
   collect line)
Такой loop возвращает список, вспомогательные переменные не нужны. (Только функция получается не на лиспе, а на loop-е. )
0
28.02.2016, 14:09
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.02.2016, 14:09
Помогаю со студенческими работами здесь

Непонятный символ возврата каретки в bash скрипте
Привет) Имею простенький скрипт: #create_username.sh ./create.sh 3xEwxAZ8 и #create.sh rm...

Найти в цикле первое вхождение возврата каретки
Найти в Цикле первое вхождение возврата каретки, как это сделать, какой символ означает переход...

Символ возврата каретки в работе веб-сервера
Ниже представлен код простейшего сервера. Мне не удается понять, зачем здесь обрабатывается case...

Какие бывают символы перевода строки?
Если открыть текстовый файл вордом, то он показывает 2 016 849 строк. А вот этот скрипт...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru