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

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

Как превратить строку из файла csv в список.

Ответ
Поиск в этой теме
Непрочитано 12.03.2020, 15:29 #1
Как превратить строку из файла csv в список.
alik3001
 
Регистрация: 12.09.2016
Сообщений: 33

Подскажите пожалуйста, как превратить строку из csv файла в список с числовыми значениями?
Например строка
"10,125.35,89.99,30.88\n"
Получаем (10 125.35 89.99 30.88)
Надеюсь есть простая функция
Просмотров: 1765
 
Непрочитано 12.03.2020, 16:34
1 | #2
kp+

идущий по граблям
 
Регистрация: 26.05.2005
Сообщений: 5,095


простая - это вряд ли, но готовая - есть: http://www.lee-mac.com/readcsv.html
kp+ вне форума  
 
Автор темы   Непрочитано 12.03.2020, 17:58
#3
alik3001


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


Цитата:
Сообщение от kp+ Посмотреть сообщение
простая - это вряд ли, но готовая - есть: http://www.lee-mac.com/readcsv.html
Спасибо. Посмотрел код - ужаснулся. Неужели нет стандартной функции в библиотеке...
alik3001 вне форума  
 
Непрочитано 13.03.2020, 10:48
#4
ciril

САПР
 
Регистрация: 29.09.2011
СПб
Сообщений: 283


Если только конвертация строки из примера, то
Код:
[Выделить все]
 (read (strcat "(" (vl-string-translate "," " " "10,125.35,89.99,30.88") ")"))
А если всего файла, то так:
Код:
[Выделить все]
 ((lambda (path)
   (if path
     ((lambda (fun dsk) (fun (read-line dsk)))
       (lambda (line)
         (if line
           (cons (read (strcat "(" (vl-string-translate "," " " line) ")")) (fun (read-line dsk)))
           (close dsk)))
       (open path "r"))
     (princ "Dont select file")))
  (getfiled "Select file" "" "csv" 0))
Offtop: На всякие частности встроенных функций не напасешься
__________________
На работе было скучно:shout:

Последний раз редактировалось ciril, 13.03.2020 в 10:56.
ciril вне форума  
 
Непрочитано 22.03.2020, 12:17
#5
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Еще вариант
Код:
[Выделить все]
(setq textline "10,125.35,89.99,30.88\n")
(mapcar 'read (str-str-lst textline ","))
Сама функция str-str-lst
Код:
[Выделить все]
    ;|
* Ф-ция str-str-lst
* Сервисная ф-ция извлечения из строки данных, разделенных
* каким либо символом или строкой символов
* Возвращает список строк
* Аргументы [Type]:
  str - строка для разбора [STRING]
  pat - разделитель [STRING]
*  Пример запуска
  (setq str "мы;изучаем;рекурсии" pat ";")
  (setq str "мы — изучаем — рекурсии" pat " — ")
  (str-str-lst str pat)
* Читать подробнее http://elpanov.com/index.php?id=14 и здесь http://www.caduser.ru/cgi-bin/f1/board.cgi?t=25113OT
|;
	    (defun str-str-lst (str pat / i)
	      (cond ((= str "") nil)
	            ((setq i (vl-string-search pat str))
	             (cons (substr str 1 i)
	                   (str-str-lst (substr str (+ (strlen pat) 1 i)) pat)
	             ) ;_  cons
	            )
	            (t (list str))
	      ) ;_  cond
	    ) ;_  defun
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 23.03.2020, 07:50
#6
trushev


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


Код:
[Выделить все]
 ;
;
;ФУНКЦИЯ ИЗВЛЕЧЕНИЯ ЦИФРОВЫХ ДАННЫХ ИЗ СТРОКИ
;
;       На вход функции подаются:
;              -       строка имеющая цифровые данные разделенные любым
;                количеством любых символов, кроме цифр, точки и минуса
;                (тире)
;              -       количество цифровых данных подлежащих извлечению
;                из строки.
;       Данные в строке должны располагатся подряд с начала строки,
;произвольная выборка данных не допустима, например из строки
;       "  123.45  678,  1236+ 50.06   "
; можно извлечь:
;       или     123.45                    -   1 число
;       или     123.45 678                -   2 числа
;       или     123.45 678 1236           -   3 числа
;       или     123.45 678 1236 50.06     -   4 числа
;Иные варианты не предусмотрены.
;        На выходе - список извлеченных чисел. Тип чисел - строковая const.
;
;Если на входе было задано количество чисел больше, чем содержится в строке,
;хвост списка на выходе дополняется символами nil до заданного количества
;чисел.
;Если строка имеет значение nil или в строке отсутсвуют цифры и символы "."
;и "-", список на выходе заполняется символами nil до заданного количества
;чисел
;
;
(defun stroka (st ;строка с данными - подается на вход функции
               nn ;к-во чисел по порядку, которые надо извлечь из строки
                / ;
                n ;счетчик символов
              sim ;значение текущего символа
            chisl ;накопитель символов - формирование числа
               sp ;список чисел - на выходе из функции
             tchk ;контроль символа "." - не более одного
            minus ;контроль символа "-" - не более одного
              )
       (if (not st)        ;если строка nil
           (setq st " ")
       );if
       (setq n 1 
           sim (substr st n 1)
       )
       (repeat nn
             ;удаление символов перед числом
             ;
              (while (and (<= n (strlen st)) ;ограничение по к-ву символов в строке
                     (and (or (< (ascii sim) 45) ; Цикл выполняется пока
                              (> (ascii sim) 46) ; код символа меньше 45
                          );or                   ; или больше 46
                          (or (< (ascii sim) 48) ; и
                              (> (ascii sim) 57) ; меньше 48 или больше 57
                          );or
                     );and
                     );and                    ;Выполняется последовательный
                     (setq n (1+ n)           ;перебор символов с позиции n,
                         sim (substr st n 1)  ;пока не встретится цифра или
                     )                        ;точка или минус
              );while
             ;Формирование числа
             ;
              (if (<= n (strlen st)) ;ограничение по к-ву символов в строке
                  (progn
                  (setq chisl ""
                         tchk t
                        minus nil
                  )
               ;Анализ первого символа числа
                  (cond ((= sim ".")     ;Если цикл закончится на сиволе "."
                         (setq chisl "0")   ;тогда первым символом числа будет 0
                        )
                        ((= sim "-")
                         (setq minus t)
                        )
                  );cond
                  );progn
              );if
                 ;сцепление символов в число
                 ;
              (while (and (<= n (strlen st)) ;ограничение по к-ву символов в строке
                     (or (and (> (ascii sim) 44) ;Цикл выполняется пока
                              (< (ascii sim) 47) ;код символа больше 44
                         );and                   ;и меньше 47
                         (and (> (ascii sim) 47) ;или
                              (< (ascii sim) 58) ;больше 47 и меньше 58
                         );and
                     );or
                     );and
                     (if (or (= sim ".") (= sim "-"))    ;Выполняется
                         (cond (tchk              ;последовательный
                                (setq chisl (strcat chisl sim) ;перебор, анализ и
                                    tchk nil             ;соединение в число
                                )                        ;символов с позиции
                               )                         ;n, пока не встрети-
                               (minus                    ;тся символ отли-
                                (setq chisl (strcat chisl sim) ;чающийся от цифры
                                   minus nil             ;или точки или мину-
                                )                        ;са.
                               )               ;При этом соблюдаются условия
                         );cond                    ;Символ "-" может быть
                         (setq chisl (strcat chisl sim)) ;только один и может
                     );if                          ;располагаться только
                     (setq n (1+ n)                ;первым символом числа
                         sim (substr st n 1)       ;Символ "." - только один
                     )                             ;Если символ "." расположен
              );while                              ;в начале числа, тогда число
              (setq sp (cons chisl sp)             ;начинается с 0
                 chisl nil
              )
       );repeat
       (reverse sp)
);defun stroka
;
;
trushev вне форума  
 
Непрочитано 23.03.2020, 10:38
#7
ciril

САПР
 
Регистрация: 29.09.2011
СПб
Сообщений: 283


Во, блин, если раньше мерялись, кто компактней код напишет и меньше переменных использует, то теперь - кто больше раздует
__________________
На работе было скучно:shout:
ciril вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как превратить строку из файла csv в список.

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как преобразовать список в строку ivspec Программирование 11 18.03.2015 10:18
Программа для редактирования XML файла acad.cuix МишаИнженер Программирование 30 12.09.2012 11:30
Lisp. Проблема после копирование стиля несущего элемента (ADT) из файла молодой человек LISP 1 02.05.2011 22:56
Как присоединить к одному чертежу (из 1ого файла) кусок продолжение (из 2ого)? star282 AutoCAD 13 17.03.2011 12:13
Частичное открытие файла - не активно при открытии файла ADik AutoCAD 4 22.06.2006 07:35