2016-07-06 73 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