1

レコードは不変であるため、データを読み込んで解析するには、それ自体の新しいインスタンスを作成する必要があります。さらに、列0からEOFまでを読み取る代わりに、特定の列の数からExcelファイルを読み取るにはどうすればよいでしょうか。とにかく、たとえば列1、列3、列5からデータを読み取ることができる場所はありますか?おそらく、列1は文字列として、列3は整数として、列5は長さとして解析されます。

(defrecord Record [Name Age Index])

(defn read-csv [fname count]
  (with-open [file (io/reader fname)]
    (doall (take count (map (comp first csv/read-csv)
                            (line-seq file))))))
(def records (map #(apply ->Record %) (read-csv "C:/Users/user/Documents/URECA/hi/lib/test.csv" 1)))

これは私が持っているものですが、列を段階的に読み取るようです

4

1 に答える 1

1

テキストフィールドの引用符を保持するには、正規表現でcsvファイルを解析できます。

(defn read-csv [fname count]
  (with-open [file (io/reader fname)]
    (doall (map #(str/split % #",") ; doesn't work with commas in text fields
                (take count (line-seq file))))))

(defn make-record [idxs types row]
  (apply ->Record
         (map (fn [idx t]
                (let [value (nth row idx)]
                  (case t
                    :string value
                    :int (Integer/parseInt value)
                    :long (Long/parseLong value))))
              idxs types)))

(def records (map (partial make-record
                           [0 2 4]
                           [:string :int :long])
                  (read-csv "/home/mobyte/test.csv" 3)))

(pprint records)
-> ({:Name "\"s1\"", :Age 1, :Index 111}
    {:Name "\"s2\"", :Age 2, :Index 112}
    {:Name "\"s3\"", :Age 3, :Index 113})

(type (:Age (first records)))
->java.lang.Integer

(type (:Index (first records)))
-> java.lang.Long

(type (:Name (first records)))
-> java.lang.String     
于 2013-01-02T06:32:49.587 に答える