【问题标题】:extracting integer's data into my txt file With Clojure使用 Clojure 将整数的数据提取到我的 txt 文件中
【发布时间】:2015-05-28 13:15:47
【问题描述】:

我是 clojure 的新手,我想提取 txt 文件中的数据(仅整数)以进行不同的处理。

我第一次想提取 txt 文件中的整数数据: ({score 1} {:score 2} {:score 3} {:score 4} {:score 5} {:score 6} {:score 7} {:score 8} {:score 9} {:score 10} {:score 11} {:score 12} {:score 13} {:score 14} {:score 11} {:score 12} {:score 13} {:score 14} {:score 15} {:score 16} {:score 17} {:score 18} {:score 19} {:score 20} {:score 21} {:score 22} {:score 23} {:score 24} {:score 11} {:score 2} {:score 3} {:score 5} {:score 8} {:score 4} {:score 5} {:score 2} {:score 2} {:score 8} {:score 4} {:score 7} {:score 5} {:score 2} {:score 5} {:score 5} {:score 2} {:score 6} {:score 2} {:score 5} {:score 2} {:score 3} {:score 5} {:score 2} {:score 3} {:score 5} {:score 23} {:score 5} {:score 7} {:score 7} {:score 7} {:score 7} {:score 7} {:score 7} {:score 7} {:score 7} {:score 7} {:score 7} {:score 7} {:score 7} {:score 7} {:score 7} {:score 0} {:score 0} {:score 0} {:score 0} {:score 0} {:score 0} {:score 0} {:score 0}

在此之后,我想在另一个文件 txt 中提取数据,以应用所有数据之间的差异操作。

第二个txt文件是这样的:

   `  <  name 1>: <45>   <name 2 >: <78>     <  name 3>: <100>  <name 4 >: <8> `

【问题讨论】:

    标签: clojure


    【解决方案1】:

    如果我是正确的,您需要如下数据:

    (1 2 3 4 5 6 7 8 9 10 11 12 13 14 11 12 13 14 15 16 17 18 19 20 21 22 23 24 11)
    

    如果是这样,那么您的解决方案就在这里

    (map :score (read-string(slurp "file-location")))
    

    【讨论】:

    • 感谢您的回复,这正是我需要的 .. 但是当我尝试以另一种格式应用它时出现错误,格式如下:&lt; name &gt; : &lt; 25 &gt; &lt; name &gt; : &lt; 30 &gt; &lt; name &gt; : &lt; 5 &gt; &lt; name &gt; : &lt; 15 &gt; 我正在使用这种语法: (map :
    • 请提供准确的数据,以便我可以帮助您..?
    • 这意味着我无法读取其他格式的字符串,例如我的第二个文件 txt?
    • 如果我是对的,我可以将我的 txt 文件转换为 edn 文件吗?很抱歉我今天需要解决这些问题
    • dude 在这里查看 conj.io 所有 clojure 高阶函数。希望它会有所帮助,如果我想出soln会更新。
    【解决方案2】:

    这是您的第二个问题的解决方案(这与您的第一个问题完全无关,它被很好地格式化为 EDN 值)。

    对于这个示例(foo.txt):

    <foo 1>: <45> <bar 2>: <78> <baz 3>: <100> <qux 4>: <8>
    

    以下创建名称到值的映射:

    (defn data-to-map [f]
      (reduce (fn [acc i] 
                (assoc acc (nth i 1) (nth i 2)))
              {} 
              (re-seq #"<([^>]+)>: <([^>]+)>" (slurp f))))
    

    它使用正则表达式将您的模式分解为 &lt;some name&gt;: &lt;some value&gt; 并使用名称作为键将它们放入映射中。

    注意,在您的问题中,您将冒号放在右括号旁边,如果有空格(如在您的 cmets 到 @piyushmandovra),那么您必须调整正则表达式以适应额外的 \s 空白值.

    repl 输出示例:

    user> (data-to-map "foo.txt")
    {"qux 4" "8", "baz 3" "100", "bar 2" "78", "foo 1" "45"}
    

    如果您只想要第二个样本中的值而不是名称(不知道为什么,但这就是您最初要求的)

    (defn data-vals-to-array [f] 
      (reduce (fn [acc i] 
                (conj acc (nth i 2)))
              []
              (re-seq #"<([^>]+)>: <([^>]+)>" (slurp f))))
    

    举例

    user> (data-vals-to-array "foo.txt")
    ["45" "78" "100" "8"]
    

    在这种情况下,它会丢弃名称并将conjs 数据放入向量中。

    您可以将缩减函数替换为简单的 #(conj %1 (last %2)),但为了清楚起见,我将其与地图示例保持相似。

    为简单起见,我将所有内容都保留为字符串。如果您的数据足够好,请使用 this SO answer 解析整数

    【讨论】:

    • 非常感谢您的回答,这些都是我检查的!塔恩克斯
    猜你喜欢
    • 2020-09-02
    • 2020-01-07
    • 2021-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多