bugfix> clojure > 投稿

次の形式のファイルからコンテンツを読み取ろうとしています。

ID |名前|国名|電話番号例:

1|Austin|Germany|34-554567
2|Mary Jane|Australia|45-78647

私はそれからデータを取得するために次のコードを使用しています:

(
  map-indexed
    #(vector %1 %2)
    (
      map #(vec(.split #"\|" %1))
      (
        line-seq (clojure.java.io/reader "test.txt")
      )
    )
)

このコードで私はこの出力を得ています:

([0 ["1" "Austin" "Germany" "34-554567"]] [1 ["2" "Mary Jane" "Australia" "45-78647"]] [2 ["3" "King Kong" "New-Zealand" "35-467533"]])

出力を次のようにします。

ID:["name" "country-name" "phone-number"]
ID:["name" "country-name" "phone-number"]

例えば:
 

1:["Austin" "Germany" "34-554567"]
2:["Mary Jane" "Australia" "45-78647"]

IDは1ずつ増加し(1、2、3などから開始)、各結果にはIDまたはIDがリストされ、IDで結合されたデータが成功し、IDでソートする必要があります。

これを実現するためにコードにどのような変更を加えますか?

回答 3 件
  • 多分

    (into {}  (map-indexed
           #(vector (inc %1) (rest %2))
           (repeat 2 ["1" "Austin" "Germany" "34-554567"])))
    
    

  • データにはすでにインデックスが含まれているようです:

    (def data
      "1|Austin|Germany|34-554567
       2|Mary Jane|Australia|45-78647
       3|King Kong|New-Zealand|35-467533 ")
    (defn fmt [line]
      (let [sections (-> line
                         str/trim
                         (str/split #"\|")) ]
        sections) )
    (defn run []
      (let [lines (vec (str/split-lines data)) ]
        (mapv fmt lines)))
    (run)
    
    

    結果付き:

    sections => ["1" "Austin" "Germany" "34-554567"]
    sections => ["2" "Mary Jane" "Australia" "45-78647"]
    sections => ["3" "King Kong" "New-Zealand" "35-467533"]
    
    

    データ内のインデックスを破棄する場合は、次のように独自に生成できます。

    (defn fmt [idx line]
      (let [sections      (-> line
                              str/trim
                              (str/split #"\|"))
            sections-keep (rest sections)
            result        (apply vector idx sections-keep)]
        result))
    (defn run []
      (let [lines (vec (str/split-lines data))]
        (mapv fmt (range 1 1e9) lines)))
    
    

    更新

    ディスクファイルを使用する場合は、次の操作を行います。

    (def data
      "1|Austin|Germany|34-554567
       2|Mary Jane|Australia|45-78647
       3|King Kong|New-Zealand|35-467533 ")
    (defn fmt [idx line]
      (let [sections      (-> line
                              str/trim
                              (str/split #"\|"))
            sections-keep (rest sections)
            result        (apply vector idx sections-keep)]
        result))
    (defn run [filename]
      (let [lines (vec (str/split-lines (slurp filename)))]
        (mapv fmt (range 1 1e9) lines)))
    (let [filename "/tmp/demo.txt"]
      (spit filename data)
      (run filename))
    
    

  • 推測:

    (def data
      "1|Austin|Germany|34-554567
       2|Mary Jane|Australia|45-78647
       3|King Kong|New-Zealand|35-467533")
    (->> (for [line (clojure.string/split data #"[ ]*[\r\n]+[ ]*")]
           (-> line (clojure.string/split #"\|") rest vec))
         (map vector (rest (range))))
    ; ([1 ["Austin" "Germany" "34-554567"]]
    ;  [2 ["Mary Jane" "Australia" "45-78647"]]
    ;  [3 ["King Kong" "New-Zealand" "35-467533"]])
    
    

    結果に明示的に自動生成されたIDを含め、元のデータにあるシリアル番号を無視する理由がわかりません。

    オプションで (into (sorted-map)) を追加する  値にマップされた連続IDを取得します。これにより、ハッシュマップとは異なり、IDの順序が保持されます

あなたの答え