csv 如何在普通Lisp中读取含有空白单元格的表格

8yparm6h  于 2023-06-19  发布在  其他
关注(0)|答案(1)|浏览(225)

我必须使用ACL读取一个包含空白单元格的大型csv表。行中的每个单元格都与第一个单元格命名的对象的特定属性相关。我使用了一个循环与read-line,但空白单元格被认为是空格,这搞乱了所有的属性列表。有人能解决这个问题吗?谢谢你

epggiuax

epggiuax1#

评论者是正确的,这比StackOverflow预期的要模糊,但我会尝试一下。
我假设你有一些理由不使用标准的csv包(效率,也许,如果你在阅读每一行的同时进行自定义处理,而不仅仅是读取所有内容然后操作它?),所以我就不提那些了。
尽管如此,如果没有关于您的具体用例的信息,我只能给予您一个简单的循环来阅读csv文件,使用cl-ppcre包(可在quicklisp上找到)将每一行按逗号拆分。您可以根据需要修改它以使用不同的分隔符,尝试将一些字符串读取为特殊值(例如整数和浮点数),按照您提到的需要,以不同的方式处理第一个元素,等等。

(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

相关问题