Как игнорировать пустые строки, обрабатывающие файл CSV в Clojure? - PullRequest
0 голосов
/ 01 апреля 2020

Как игнорировать пустые строки при отображении zipmap в файл?

(defn csv-data->maps [csv-data]
  (map zipmap
       (->> (first csv-data) ;; First row is the header
            repeat)
       (rest csv-data)))

1 Ответ

0 голосов
/ 01 апреля 2020

Самый простой способ - это повторно использовать существующую библиотеку :

(ns tst.demo.core
  (:use tupelo.core tupelo.test)
  (:require
    [clojure.string :as str]
    [schema.core :as s]
    [tupelo.csv :as csv]))

(s/defn remove-blank-lines :- s/Str
  "Accepts a multi-line text string, and returns one with any blank lines removed."
  [text-str :- s/Str]
  (let [text-lines      (str/split-lines text-str)
        lines-no-blanks (remove str/blank? text-lines)
        text-no-blanks  (str/join \newline lines-no-blanks)]
    text-no-blanks))

(dotest
  (let [csv-text           "zip-postal-code,store-num,chain-rank
                            01002,00006,4
                            01002,00277,5

                            01003,00277,5
                            01008,01217,5
                            01009,00439,5
                            01020,01193,5"
        csv-text-no-blanks (remove-blank-lines csv-text)
        csv-entities       (csv/parse->entities csv-text-no-blanks)
        csv-attrs          (csv/entities->attrs csv-entities)]
    (is= csv-entities
      [{:zip-postal-code "01002", :store-num "00006", :chain-rank "4"}
       {:zip-postal-code "01002", :store-num "00277", :chain-rank "5"}
       {:zip-postal-code "01003", :store-num "00277", :chain-rank "5"}
       {:zip-postal-code "01008", :store-num "01217", :chain-rank "5"}
       {:zip-postal-code "01009", :store-num "00439", :chain-rank "5"}
       {:zip-postal-code "01020", :store-num "01193", :chain-rank "5"}])

Как показывает пример, вы можете получить данные CSV как ориентированные на строки (карты объектов) ) или ориентированный на столбцы (атрибуты векторов).

    (is= csv-attrs
      {:store-num       ["00006" "00277" "00277" "01217" "00439" "01193"],
       :zip-postal-code ["01002" "01002" "01003" "01008" "01009" "01020"],
       :chain-rank      ["4" "5" "5" "5" "5" "5"]})
    ))

См. документы здесь для tupelo.csv lib.


Другой способ ( возможно, проще) предварительно обработать файл с помощью простого Unix инструмента, например sed. Рассмотрим пример файла:

~/expr/demo > cat csv.txt                
zip-postal-code,store-num,chain-rank

01002,00006,4
01002,00277,5

01003,00277,5
01008,01217,5
01009,00439,5
01020,01193,5

и обработайте его с помощью sed (Stream EDitor):

~/expr/demo > sed  '/^ *$/d'  csv.txt   
zip-postal-code,store-num,chain-rank
01002,00006,4
01002,00277,5
01003,00277,5
01008,01217,5
01009,00439,5
01020,01193,5

Альт!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...