map-indexedとvectorを使ってClojureで文字列をフォーマットする方法

I am trying to read content from a file which is in the format :

ID|Name|Country-Name|Phone-Number eg:

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"]

eg:

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

ここで、IDは1ずつ増加し(1,2,3など)、各結果にはIDまたはIDがリストされ、IDと結合されたデータが続き、IDでソートされます。

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

0
あなたが尋ねていることがあなたが得ていることに非常に近いように見えます。
追加された 著者 manandearth,
IDをキーとした地図を作るということですか? を試してください({}あなたの出力に)
追加された 著者 Hendrik Poernama,
はい、私は自分のテキストファイルにあるID番号を出力として取得しているものに割り当てようとしています。最後にそれらを簡単にソートするように
追加された 著者 Prishu,
はい、私は自分のテキストファイルにあるID番号を出力として取得しているものに割り当てようとしています。最後にそれらを簡単にソートするように
追加された 著者 Prishu,
@manandearthは実際に私が今手に入れているものが私の実際の出力に合いませんでした。さらに、すべてをベクトルとして割り当て、すべての値をそれらのインデックスで取得することはほとんど困難ではありません。
追加された 著者 Prishu,
@manandearthは実際に私が今手に入れているものが私の実際の出力に合いませんでした。さらに、すべてをベクトルとして割り当て、すべての値をそれらのインデックスで取得することはほとんど困難ではありません。
追加された 著者 Prishu,

5 答え

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

(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))
0
追加された
ファイルの作成を示すために spit を追加しただけです。あなたがすでに持っているなら、あなたは明らかにそれを必要としません。
追加された 著者 Alan Thompson,
あなたの最新の回答では、これは私が理解していることです。データを demo.txt という名前のファイルに入れてから、slurpを使用してそのファイルを読み取っています。 fmt関数では、トリムとスプリットの操作を適用してから、defnの実行で、引数としてfmtを渡してベクトルをマッピングします。間違っていたら訂正してください。ところで、私はすでにデータを読んでいるところからファイルを持っています。 demo.txt のように新しいものを作成する必要はありますか。私の頭の上で跳ねるもの
追加された 著者 Prishu,

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

(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))
0
追加された
ファイルの作成を示すために spit を追加しただけです。あなたがすでに持っているなら、あなたは明らかにそれを必要としません。
追加された 著者 Alan Thompson,
あなたの最新の回答では、これは私が理解していることです。データを demo.txt という名前のファイルに入れてから、slurpを使用してそのファイルを読み取っています。 fmt関数では、トリムとスプリットの操作を適用してから、defnの実行で、引数としてfmtを渡してベクトルをマッピングします。間違っていたら訂正してください。ところで、私はすでにデータを読んでいるところからファイルを持っています。 demo.txt のように新しいものを作成する必要はありますか。私の頭の上で跳ねるもの
追加された 著者 Prishu,

推測:

(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の順序を保持します。

0
追加された
少なくとも絶対ファイルパスを使用する場合は、 slurp を使用してファイルの内容を文字列として取得できます。あなたが記述する「出力」はClojureデータ構造ではないので、それはClojure関数によって生成することはできません。代わりにそれをプリントアウトしますか? sorted-map に を挿入しますか?
追加された 著者 NikoNyrh,
nthget など、ベクトルから要素を取得するための関数がいくつかあります。 (["Austin" "Germany" "34-554567"] 1)"Germany" と評価されます。
追加された 著者 NikoNyrh,
こんにちは@NikoNyrh、私はテキストファイルからデータを取得し、それにあなたの言及された操作を適用している間私は少し問題に直面しているので私のあなたの答えを更新してください。
追加された 著者 Prishu,
どうやって(([[1 ["Austin" "Germany" "34-554567"]]))のような値を取得できるか教えてください。等
追加された 著者 Prishu,

多分

(into {}  (map-indexed
       #(vector (inc %1) (rest %2))
       (repeat 2 ["1" "Austin" "Germany" "34-554567"])))
0
追加された

多分

(into {}  (map-indexed
       #(vector (inc %1) (rest %2))
       (repeat 2 ["1" "Austin" "Germany" "34-554567"])))
0
追加された