次の形式のファイルからコンテンツを読み取ろうとしています。
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 件
データにはすでにインデックスが含まれているようです:
(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の順序が保持されます
関連記事
- 断続的な変数を再利用せずに、dictキーを使用して文字列をフォーマットする効率的な方法
- 文字列から日付形式を検索する正規表現
- Juliaでmatchを使用して文字列から構造体に値を解析する
- オートマッパーを使用して、コンマ区切りの文字列または整数でIEnumerable にマップする方法
- bash、文字列を使用するためのスクリプト
- 再帰を使用して文字列内の2文字を交換する
- 日付文字列をフルテキストにフォーマットする方法DDMM YYYY?
- 整数と文字列の組み合わせのPython印刷形式
- ジェネレータを使用して文字列をリストに適切に変換する方法
- Spacyのカスタムトークナイザーを使用して、スペースなしで文字列をトークン化します
多分