新手在 Clojure 中转换 CSV 文件

2024-01-09

我对编程既是新手又是老手——大多数时候我只是在工作中编写很多小的 Perl 脚本。当我想学习 Lisp 时,Clojure 就出现了,所以我也想在不懂 Java 的情况下学习 Clojure。这很艰难,但到目前为止很有趣。

我见过几个与我的问题类似的例子,但没有一个完全符合我的问题空间。 Clojure 中是否有一种规范的方法来提取 CSV 文件每一行的值列表?

这是一些实际工作的 Perl 代码;非 Perler 的评论包括:

# convert_survey_to_cartography.pl
open INFILE, "< coords.csv";       # Input format "Northing,Easting,Elevation,PointID"
open OUTFILE, "> coords.txt";      # Output format "PointID X Y Z".
while (<INFILE>) {                 # Read line by line; line bound to $_ as a string.
    chomp $_;                      # Strips out each line's <CR><LF> chars.
    @fields = split /,/, $_;       # Extract the line's field values into a list.
    $y = $fields[0];               # y = Northing
    $x = $fields[1];               # x = Easting
    $z = $fields[2];               # z = Elevation
    $p = $fields[3];               # p = PointID
    print OUTFILE "$p $x $y $z\n"  # New file, changed field order, different delimiter.
}

我在 Clojure 中遇到了一些困惑,并尝试以命令式的方式将其拼凑在一起:

; convert-survey-to-cartography.clj
(use 'clojure.contrib.duck-streams)
(let
   [infile "coords.csv" outfile "coords.txt"]
   (with-open [rdr (reader infile)]
     (def coord (line-seq rdr))
     ( ...then a miracle occurs... )
     (write-lines outfile ":x :y :z :p")))

我不希望最后一行真正起作用,但它表达了要点。我正在寻找类似的东西:

(def values (interleave (:p :y :x :z) (re-split #"," coord)))

谢谢,比尔


请不要使用嵌套的 def。它不会做你认为它会做的事。 def 始终是全局的!对于当地人来说,请使用 let 代替。虽然库函数很高兴了解,但这里的版本总体上协调了函数式编程的一些功能,特别是 clojure。

(import 'java.io.FileWriter 'java.io.FileReader 'java.io.BufferedReader)

(defn translate-coords

文档字符串可以通过 (doc translate-coords) 在 REPL 中查询。作品例如。对于所有核心功能。因此,提供一个是一个好主意。

  "Reads coordinates from infile, translates them with the given
  translator and writes the result to outfile."

翻译器是一个(可能是匿名的)函数,它从周围的样板中提取翻译。所以我们可以用不同的转换规则重用这个函数。这里的类型提示避免了构造函数的反射。

  [translator #^String infile #^String outfile]

打开文件。 with-open 会注意,当文件主体离开时,文件将被关闭。无论是通过正常的“从底部掉落”还是通过抛出的异常。

  (with-open [in  (BufferedReader. (FileReader. infile))
              out (FileWriter. outfile)]

我们绑定*out*临时流到输出文件。因此,装订内的任何打印都会打印到文件中。

    (binding [*out* out]

The map意思是:获取 seq 并将给定函数应用于每个元素并返回结果的 seq。这#()是匿名函数的简写符号。它需要一个参数,该参数填写在%. The doseq基本上是输入的循环。由于我们这样做是为了产生副作用(即打印到文件),doseq是正确的构造。经验法则:map: 懒惰=>结果,doseq: 渴望 => 副作用。

      (doseq [coords (map #(.split % ",") (line-seq in))]

println照顾\n在线的末尾。interpose接受 seq 并在其元素之间添加第一个参数(在我们的例子中为“”)。(apply str [1 2 3])相当于(str 1 2 3)对于动态构造函数调用很有用。这->>是 clojure 中相对较新的宏,这对可读性有所帮助。它的意思是“获取第一个参数并将其作为最后一项添加到函数调用中”。给定的->>相当于:(println (apply str (interpose " " (translator coords))))。 (编辑:另一个注释:因为分隔符是\space,我们也可以在这里写(apply println (translator coords)),但是interpose版本还允许参数化分隔符,就像我们对翻译器功能所做的那样,而短版本将硬连线\space.)

        (->> (translator coords)
          (interpose " ")
          (apply str)
          println)))))

(defn survey->cartography-format
  "Translate coords in survey format to cartography format."

这里我们使用解构(注意双[[]])。这意味着函数的参数可以转换为 seq,例如。向量或列表。将第一个元素绑定到y,第二个到x等等。

  [[y x z p]]
  [p x y z])

(translate-coords survey->cartography-format "survey_coords.txt" "cartography_coords.txt")

这里又不那么断断续续了:

(import 'java.io.FileWriter 'java.io.FileReader 'java.io.BufferedReader)

(defn translate-coords
  "Reads coordinates from infile, translates them with the given
  translator and writes the result to outfile."
  [translator #^String infile #^String outfile]
  (with-open [in  (BufferedReader. (FileReader. infile))
              out (FileWriter. outfile)]
    (binding [*out* out]
      (doseq [coords (map #(.split % ",") (line-seq in))]
        (->> (translator coords)
          (interpose " ")
          (apply str)
          println)))))

(defn survey->cartography-format
  "Translate coords in survey format to cartography format."
  [[y x z p]]
  [p x y z])

(translate-coords survey->cartography-format "survey_coords.txt" "cartography_coords.txt")

希望这可以帮助。

编辑:对于 CSV 读取,您可能需要 OpenCSV 之类的东西。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

新手在 Clojure 中转换 CSV 文件 的相关文章

  • 在 Windows 7 中使用 ActivePerl @ARGV 为空

    我有以下 Perl 脚本 我正在尝试使用 ActivePerl 在 Windows 7 中运行它 c Perl64 bin perl exe w use strict my mp3splt exe c Program Files x86 m
  • Perl:正则表达式不抓取代码中的多行 C 风格注释

    我有一个 Perl 程序 读取用 C 编写的 SRC 文件 使用 SRC 文件中的正则表达式匹配来查找特定格式的数据以用作目标文件名 打开新的目标文件 执行另一个正则表达式匹配以查找包含关键字 abcd 的所有 C 风格注释 注意 这些注释
  • 折叠具有多个字段的行

    我有这个代码 awk seen 1 2 a 1 a 1 a 1 t 2 END for i in a print i a i inputfile 我想折叠具有两个以上字段的行 但始终基于第一个字段作为索引 输入文件 三列制表符分隔 prot
  • 如何在 Perl 中使用原始套接字?

    你怎样才能得到一个rawPerl 中的套接字 那么构建与其一起使用的数据包的最佳方法是什么 与在 C 中执行的操作相同 通过在创建套接字时设置套接字类型 在示例中CPAN http search cpan org rgarcia perl
  • 什么是 fn* 以及 Clojure 如何引导?

    The Clojure core 的来源 https github com clojure clojure blob master src clj clojure core clj似乎假设预先存在fn 这是在哪里定义的 引导程序还需要什么
  • Perl 程序如何知道在哪里可以找到包含它使用的 Perl 模块的文件?

    如果我的 Perl 程序使用 Perl 模块 它将如何确定在哪里找到包含模块代码的文件 例如 如果程序包含 use MyModule1 Example 1 use This Here MyModule2 Example 2 它会看起来在哪里
  • 如何彻底删除 Perl 中的包?

    如何在 Perl 中彻底删除一个包 这不仅意味着包变量 还意味着 Perl 更新以处理继承更改和其他事情的任何魔术表 这个简单的测试 use warnings use strict use Test LeakTrace use Symbol
  • Clojure def 与 defn 对于没有参数的函数

    我用 clojure 编写了一个程序 但有些函数没有参数 将此类函数编码为 def 而不是不带参数的 defn 有什么优点 def t0 System currentTimeMillis defn t1 System currentTime
  • 使用 Visual Studio Code 调试 Perl

    我今天刚开始使用 Perl 并安装了活动Perl https en wikipedia org wiki ActivePerl5 24 1 一切都很顺利 我能够创建我的测试程序testPerl pl与简单的print命令并运行它consol
  • 设置、让、宏、坚果

    我正在尝试从 html 内容构建一个快速目录 为了简短起见 代码非常简单 defn toc content doseq i take 5 iterate inc 1 let h str h i println content h where
  • 如何在 Perl 中修改 Windows NTFS 权限?

    我在 Windows Server 2003 上使用 ActiveState Perl 我想在 Windows NTFS 分区上创建一个目录 然后授予 Windows NT 安全组对该文件夹的读取访问权限 这在 Perl 中可能吗 我必须使
  • 在 Clojure 中解压缩 zlib 流

    我有一个二进制文件 其内容由zlib compress在Python上 有没有一种简单的方法可以在Clojure中打开和解压缩它 import zlib import json with open data json zlib wb as
  • 何时计划 (SELECT) 查询?

    在 PostgreSQL 中 什么时候计划 SELECT 查询 Is it 在报表准备时 或者 在处理 SELECT 开始时 或者 别的东西 我问的原因是 Stackoverflow 上有一个问题 相同的查询 两种不同的方式 性能截然不同
  • Perl `join` 生成多行字符串

    我有这个程序来对两个数组进行排序 usr bin perl w movies movies txt open FHD movies die could not open movies n movies
  • 如何安装 leiningen 插件?

    如何安装 leiningen 插件 例如 leiningen run 我看到这个叫做 clojars org 的东西 以及如何 推 它 但我没有看到任何关于从中 拉 的东西 如果 Clojars 上有可用的插件 例如 lein run 只需
  • 打印出匿名子程序的代码

    我目前正在一个非常复杂的 Perl 架构中工作 我想创建一些调试工具 由于许多行为涉及匿名子例程 因此我想分析其中一些行为 而我所要做的就是对子例程的引用 简而言之 有没有办法打印子例程引用的代码 因为 Perl 被解释 它可能仍然可用 核
  • 与 6 位随机字母数字代码发生冲突的概率是多少?

    我使用以下 Perl 代码生成随机字母数字字符串 仅限大写字母和数字 用作 MySQL 数据库中记录的唯一标识符 数据库的行数可能会保持在 1 000 000 行以下 但实际的绝对最大值约为 3 000 000 行 我是否有 2 条记录具有
  • 如何检测FTP文件传输完成?

    我正在编写一个脚本 用于轮询 FTP 站点上的文件并在可用时将它们下载到本地 文件由各个来源方随机存放到 FTP 站点 我需要一种方法能够在下载之前检测 FTP 站点上的文件是否已被源方完全传输 关于如何解决这个问题有什么想法吗 如果您可以
  • Clojure 符号名称中的美元符号 ($)

    我一直在编写 clojure 解析器并遇到以下语法 defn key Returns the key of the map entry added 1 0 static true java util Map Entry e e getKey
  • 如何使用 Clojure 在命令行中更改目录?

    我正在寻找的是 Windows 命令行中的这种命令行交互 C temp1 gt clj some script clj C temp2 gt 其中 some script clj 包含类似以下内容 cd c temp2 那么问题来了 如何实

随机推荐

  • jQuery Datepicker 中的“今天”按钮不起作用

    我正在使用 jQueryUI Datepicker 并显示 今天 按钮 但这不起作用 它在演示中也不起作用 http www jqueryui com demos datepicker buttonbar http www jqueryui
  • Python pandas 与 OR 逻辑合并

    我正在搜索 但没有找到这个问题的答案 你可以使用 OR 逻辑执行 pandas 数据帧的合并吗 基本上 相当于使用 where t1 A t2 A OR t1 A t2 B 的 SQL 合并 我遇到一种情况 我将信息从一个数据库提取到数据帧
  • ORACLE SQL LISTAGG 未返回预期结果

    我正在运行 Oracle Database 11g Enterprise 11 2 0 4 0 PL SQL Release 11 2 0 4 0 并且在获取 LISTAGG 函数返回我期望的数据集时遇到一些问题 这是场景 我有一个看起来像
  • 将WAR部署到WebSphere 9需要3个小时

    过去将 WAR 部署到 WebSphere 8 5 5 0 需要 3 分钟 将相同的 WAR 部署到 WebSphere 9 0 0 2 需要 3 个小时 这是 WebSphere 9 0 0 2 中错误的表现吗 有人有类似的经历吗 更新
  • iphone界面发光效果问题

    我想在这个名为 convert 的应用程序中实现我认为是 UILabels 或者可能是自定义控件 的发光效果 我认为该应用程序看起来非常简洁 我正在尝试为我自己的应用程序实现类似的效果 有什么帮助吗 此致 david 替代文本 http w
  • 如何为 Excel 创建 GUI 插件?

    我在 Google 上进行了一些研究 但仍然找不到 Visual Studio 中的项目 我想为 Excel 创建一个 GUI 插件 例如带有 Windows 窗体的功能区上的停靠窗口 这是 Visual Studio 中的什么项目 我已经
  • 将控件添加到 Office 中的现有功能区组 (VSTO)

    我找到了很多关于如何向现有功能区添加新组的示例 这效果很好 我不知道如何将新控件添加到现有功能区上的现有组中 假设我想将自己的命令添加到 审阅 选项卡上的 校对 组中 我正在 VS2010 中为 Office2010 开发此程序 但我想同样
  • Spring Boot中增加Tomcat的连接超时

    如何增加超时 以便在处理响应之前 请求不会超时 Spring Boot 中的 Tomcat 设置 server tomcat max connections 2000 server tomcat max threads 200 server
  • 一个 CIImage 中有多个 CIFilter?

    我有两个 CIFilter 曝光和色调 我需要将过滤器组合到一个 UIImage 上 我该怎么办 下面是我到目前为止所拥有的一些代码 CIFilter hueFilter CIFilter exposureFilter CIImage ad
  • 如何在Python中将数字四舍五入为有效数字

    我需要对要在用户界面中显示的浮动进行舍入 例如 一位有效数字 1234 gt 1000 0 12 gt 0 1 0 012 gt 0 01 0 062 gt 0 06 6253 gt 6000 1999 gt 2000 有没有一种使用 Py
  • Flexbox - 在项目内垂直对齐未知高度的元素[重复]

    这个问题在这里已经有答案了 给予是没有问题的一个元素Flexbox 项目内的高度相同 但我无法让它与多个项目一起使用 Fiddle https jsfiddle net no9jkj7m https jsfiddle net no9jkj7
  • 使用 LayoutInflaterCompat.setFactory 的 Android 菜单项字体

    我正在尝试更改菜单项的字体 根据这个答案 https stackoverflow com a 29903311 2311651 我在用着LayoutInflaterCompat setFactory 我的项目中使用支持库22 1 1 我的代
  • 如何返回完全解决的承诺?

    我正在尝试使用 q 编写一些测试 尝试存根 Promise 等 我想知道是否有一种方法可以返回完全解析的 Promise 就像可以使用whenjs when 要返回的东西 之类的东西来做到这一点那将等于这个 function fullyRe
  • Google 云端硬盘文件 etag

    文件资源的 etag 如何工作 即使文件没有进行任何更改 它看起来也会发生变化 有没有办法获取校验和或仅在文件更新时更改的内容 感谢您的帮助 当文件的元数据更改时 文件的 Etag 也会更改 如果您只想监视文件内容的更改 可以使用md5Ch
  • 我不明白 JavaScript 上的 Crockford:前进之路

    在一场名为 前进之路 的讲座中 道格拉斯 克罗克福德 Douglass Crockford 表示 他不再在 JavaScript 中使用 new 并且正在放弃 this 他说 JavaScript 的优点与其说是原型继承 不如说是无类继承
  • 如何消除单击JavaFX按钮时的展开效果?

    单击 JavaFX 按钮时如何消除小展开效果 还有我怎样才能让它像菜单按钮一样工作 当我按下它以保持聚焦状态直到我按下另一个 菜单 按钮时 有没有办法将节点分组到同一焦点 三个问题一个的价格 单击 JavaFX 按钮时如何消除小展开效果 当
  • 可执行代码处无法到达断点

    我有两个 DLL 一个用本机 C 编写 另一个用 C CLI 编写 前者被注入到进程中 并在稍后的时间点加载后者 在调试时 我注意到本机 DLL 的断点运行正常 而其他断点则运行不正常 即使其代码正在执行 断点显示此消息 不会命中断点 没有
  • 从 C# 的 PowerShell 脚本调用特定函数

    有没有办法从 C 代码的 PowerShell 脚本中调用特定函数 我已经启动并运行了使用 PowerShell 脚本执行字符串的基本示例 如果我有一个包含许多函数的文件 并且我只想将特定函数加载到 C 中并执行它 该怎么办 如何才能做到这
  • FileNotFoundError: [Errno 2] 没有这样的文件或目录: '/content/drive/MyDrive/Santillana/geckodriver' 在 Google Colab 中使用 Selenium 库

    我正在尝试在 Google Colab 中使用 Selenium 但是当我尝试运行 Firefox 实例时出现一些错误 我点击了这个链接 硒文档 https www selenium dev documentation webdriver
  • 新手在 Clojure 中转换 CSV 文件

    我对编程既是新手又是老手 大多数时候我只是在工作中编写很多小的 Perl 脚本 当我想学习 Lisp 时 Clojure 就出现了 所以我也想在不懂 Java 的情况下学习 Clojure 这很艰难 但到目前为止很有趣 我见过几个与我的问题