(defun read-csv (filename)
(with-open-file (f filename)
(let ((ptrn (cl-ppcre:create-scanner ",( *|)")))
(loop for line = (read-line f nil)
while line
collect
(let* ((line (string-trim (list #\
) line)))
;; The above trims the newline character from the end of each line.
;; It shows up as ^M in my editor, in case StackOverflow borks the character codes and you need to type it manually.
(cl-ppcre:split ptrn line))))))
用途:
;;; Returns a list of lists
;;; Each sublist contains the elements in one line of the CSV file
(uiop:with-current-directory ((uiop:getcwd)) ;; Replace with the name of your directory
(read-csv "csv-read-manual.csv")) ;; Replace with the name or relative path of your csv
1条答案
按热度按时间epggiuax1#
评论者是正确的,这比StackOverflow预期的要模糊,但我会尝试一下。
我假设你有一些理由不使用标准的csv包(效率,也许,如果你在阅读每一行的同时进行自定义处理,而不仅仅是读取所有内容然后操作它?),所以我就不提那些了。
尽管如此,如果没有关于您的具体用例的信息,我只能给予您一个简单的循环来阅读csv文件,使用
cl-ppcre
包(可在quicklisp上找到)将每一行按逗号拆分。您可以根据需要修改它以使用不同的分隔符,尝试将一些字符串读取为特殊值(例如整数和浮点数),按照您提到的需要,以不同的方式处理第一个元素,等等。用途: