2016-07-06 180 views
1

我从Python的这段代码读取CSV如线串(逗号分隔文本值)文件行,然后每个这样的行字符串分解到字段并打印出每个在控制台上:将csv文件读入列表列表的Lisp代码。

def readfilefn(filename): 
    with open(filename,"r") as f: 
     for line in f: 
      flds = line.split(',') 
      for fld in flds: 
       print fld.strip() 

我想将其转换为Lisp代码。我发现How can I read the contents of a file into a list in Lisp?下面的代码:

(defun get-file (filename) 
    (with-open-file (stream filename) 
    (loop for line = (read-line stream nil) 
      while line 
      collect line))) 

,一个来自:https://groups.google.com/forum/#!topic/comp.lang.lisp/r8O6Py8E1zE

(defun read-all-lines (input-stream) 
    (do ((line nil) 
     (result nil (cons line result))) 
     ((eq line :eof) (nreverse result)) 
    (setq line (read-line input-stream nil :eof)))) 

(这里的线路将不得不使用nreverse被逆转)。

对于全行字符串的分成场字符串:https://gist.github.com/siguremon/1174988

(defun split-str (string &optional (separator " ")) 
    (split-str-1 string separator)) 

(defun split-str-1 (string &optional (separator " ") (r nil)) 
    (let ((n (position separator string 
      :from-end t 
      :test #'(lambda (x y) 
        (find y x :test #'string=))))) 
    (if n 
    (split-str-1 (subseq string 0 n) separator (cons (subseq string (1+ n)) r)) 
     (cons string r)))) 

还有很多其他的程序也随处可见,如http://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/need-a-lisp-routine-to-string-split/td-p/2618387

我想知道这些是安全的方法还是最好的方法。我在Linux上使用clisp(Common Lisp)。感谢您的评论/答复。

+1

最简单的方法是使用现有的库。 [cl-csv](https://github.com/AccelerationNet/cl-csv)似乎有一个将文件读入列表清单的功能。 – jkiiski

+0

您正试图转换Python代码?到目前为止,你有什么? –

+0

我不能像Python代码那样简单。 – rnso

回答

3

对不起,有点迟了,正如在jkilky的评论中所建议的那样,我将使用通用的lisp库cl-csv,它可以通过quicklisp获得。

CL-USER> (ql:quickload :cl-csv) 
To load "cl-csv": 
    Load 1 ASDF system: 
    cl-csv 
; Loading "cl-csv" 
... 
(:CL-CSV) 

的CL-CSV分割你的列表的列表文件让我们使用CSV文件从here称为train.csv是一个正常的CSV文件:

PassengerId,Survived,Pclass,Name,Sex,Age,SibSp,Parch,Ticket,Fare,Cabin,Embarked 
1,0,3,"Braund, Mr. Owen Harris",male,22,1,0,A/5 21171,7.25,,S 
2,1,1,"Cumings, Mrs. John Bradley (Florence Briggs Thayer)",female,38,1,0,PC 17599,71.2833,C85,C 
3,1,3,"Heikkinen, Miss. Laina",female,26,0,0,STON/O2. 3101282,7.925,,S 
4,1,1,"Futrelle, Mrs. Jacques Heath (Lily May Peel)",female,35,1,0,113803,53.1,C123,S 
5,0,3,"Allen, Mr. William Henry",male,35,0,0,373450,8.05,,S 
6,0,3,"Moran, Mr. James",male,,0,0,330877,8.4583,,Q 
7,0,1,"McCarthy, Mr. Timothy J",male,54,0,0,17463,51.8625,E46,S 
8,0,3,"Palsson, Master. Gosta Leonard",male,2,3,1,349909,21.075,,S 
9,1,3,"Johnson, Mrs. Oscar W (Elisabeth Vilhelmina Berg)",female,27,0,2,347742,11.1333,,S 
10,1,2,"Nasser, Mrs. Nicholas (Adele Achem)",female,14,1,0,237736,30.0708,,C 
11,1,3,"Sandstrom, Miss. Marguerite Rut",female,4,1,1,PP 9549,16.7,G6,S 
12,1,1,"Bonnell, Miss. Elizabeth",female,58,0,0,113783,26.55,C103,S 
13,0,3,"Saundercock, Mr. William Henry",male,20,0,0,A/5. 2151,8.05,,S 
... 
... 

的CL-CSV加载它列出每个行的目录是:

CL-USER> (cl-csv:read-csv #P"./train.csv") 
(("PassengerId" "Survived" "Pclass" "Name" "Sex" "Age" "SibSp" "Parch" "Ticket" 
    "Fare" "Cabin" "Embarked") 
("1" "0" "3" "Braund, Mr. Owen Harris" "male" "22" "1" "0" "A/5 21171" "7.25" 
    "" "S") 
("2" "1" "1" "Cumings, Mrs. John Bradley (Florence Briggs Thayer)" "female" 
    "38" "1" "0" "PC 17599" "71.2833" "C85" "C") 
("3" "1" "3" "Heikkinen, Miss. Laina" "female" "26" "0" "0" "STON/O2. 3101282" 
    "7.925" "" "S") 
("4" "1" "1" "Futrelle, Mrs. Jacques Heath (Lily May Peel)" "female" "35" "1" 
    "0" "113803" "53.1" "C123" "S") 
("5" "0" "3" "Allen, Mr. William Henry" "male" "35" "0" "0" "373450" "8.05" "" 
    "S") 
("6" "0" "3" "Moran, Mr. James" "male" "" "0" "0" "330877" "8.4583" "" "Q") 
("7" "0" "1" "McCarthy, Mr. Timothy J" "male" "54" "0" "0" "17463" "51.8625" 
    "E46" "S") 
("8" "0" "3" "Palsson, Master. Gosta Leonard" "male" "2" "3" "1" "349909" 
    "21.075" "" "S") 

然后打印它只是使用的格式功能,这是打印清单的小动作和每个列表的分隔符,我用零来代替吨得到一个字符串,但你可以用t打印,所以这是在lisp中得到这个的一行代码,我使用新的行分隔符作为列表的第一级(然后是行),然后是项目的“,”行:

CL-USER> (format nil "~{~{~a, ~}~% ~}" (cl-csv:read-csv #P"train.csv")) 

"PassengerId, Survived, Pclass, Name, Sex, Age, SibSp, Parch, Ticket, Fare, Cabin, Embarked, 
1, 0, 3, Braund, Mr. Owen Harris, male, 22, 1, 0, A/5 21171, 7.25, , S, 
2, 1, 1, Cumings, Mrs. John Bradley (Florence Briggs Thayer), female, 38, 1, 0, PC 17599, 71.2833, C85, C, 
3, 1, 3, Heikkinen, Miss. Laina, female, 26, 0, 0, STON/O2. 3101282, 7.925, , S, 
4, 1, 1, Futrelle, Mrs. Jacques Heath (Lily May Peel), female, 35, 1, 0, 113803, 53.1, C123, S, 
5, 0, 3, Allen, Mr. William Henry, male, 35, 0, 0, 373450, 8.05, , S, 
6, 0, 3, Moran, Mr. James, male, , 0, 0, 330877, 8.4583, , Q, 
7, 0, 1, McCarthy, Mr. Timothy J, male, 54, 0, 0, 17463, 51.8625, E46, S, 
8, 0, 3, Palsson, Master. Gosta Leonard, male, 2, 3, 1, 349909, 21.075, , S, 
9, 1, 3, Johnson, Mrs. Oscar W (Elisabeth Vilhelmina Berg), female, 27, 0, 2, 347742, 11.1333, , S, 
10, 1, 2, Nasser, Mrs. Nicholas (Adele Achem), female, 14, 1, 0, 237736, 30.0708, , C, 
11, 1, 3, Sandstrom, Miss. Marguerite Rut, female, 4, 1, 1, PP 9549, 16.7, G6, S, 
12, 1, 1, Bonnell, Miss. Elizabeth, female, 58, 0, 0, 113783, 26.55, C103, S, 
13, 0, 3, Saundercock, Mr. William Henry, male, 20, 0, 0, A/5. 2151, 8.05, , S, 
14, 0, 3, Andersson, Mr. Anders Johan, male, 39, 1, 5, 347082, 31.275, , S, 
15, 0, 3, Vestrom, Miss. Hulda Amanda Adolfina, female, 14, 0, 0, 350406, 7.8542, , S, 
16, 1, 2, Hewlett, Mrs. (Mary D Kingcome) , female, 55, 0, 0, 248706, 16, , S, 
17, 0, 3, Rice, Master. Eugene, male, 2, 4, 1, 382652, 29.125, , Q, 
18, 1, 2, Williams, Mr. Charles Eugene, male, , 0, 0, 244373, 13, , S, 
19, 0, 3, Vander Planke, Mrs. Julius (Emelia Maria Vandemoortele), female, 31, 1, 0, 345763, 18, , S, 

我希望这有助于

+0

感谢您的解答。 – rnso

+0

我实际上现在使用的是Racket,它是Scheme/Lisp衍生产品。你会相当于球拍套餐吗? – rnso

+0

那么,我不知道Racket,但它有包管理器作为quicklisp,以及两个目录,例如https://pkgs.racket-lang.org/#,你有csv和csv- – anquegi