2016-07-06 21 views
1

私は、CSV(カンマ区切りテキスト値)を読み取るためのPythonからこのコードを持って行毎にファイルの文字列として、またフィールドに、このような各ラインの文字列を分割し、コンソールにそれぞれの印刷: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コードに変換します。

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

と1: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のを使用して逆にする必要があります)私はHow can I read the contents of a file into a list in Lisp?に以下のコードを発見しました。フィールド文字列にフルライン文字列の分割のため

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さんのコメントで示唆しているように少し遅れて申し訳ありませんが、私はcommonlispライブラリcl-csvを使用します。これはquicklispで利用できます。

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

リストのリストでは、あなたのファイルがのがtrain.csv呼ばhereからcsvファイルを使用してみましょうCL-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を使用し、これは印刷リストのほとんどトリックと各リスト用セパレータであり、フォーマット関数を使用し、それを印刷します文字列を取得していますが、これをtで印刷することができます。これはlispでこれを取得するための1行です。リストの最初のレベル(行)に新しい行区切り文字を使用し、次に項目行の:

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

私はScheme/Lispの派生物であるRacketを実際に使用しています。あなたはラケットの同等のパッケージですか? – rnso

+0

まあ、ラケットは分かりませんが、quicklispのパッケージマネージャーと、例えばhttps://pkgs.racket-lang.org/#の2つのカタログがあります。あなたはcsvとcsv-reading – anquegi

関連する問題