Scala:以功能方式迭代 CSV 文件?

2024-01-03

我有 CSV 文件,其中包含给出列名称的注释,其中列在整个文件中发生变化:

#c1,c2,c3
a,b,c
d,e,f
#c4,c5
g,h
i,j

我想提供一种方法来迭代(仅)文件的数据行作为列名到值(所有字符串)的映射。所以上面的内容就变成了:

Map(c1 -> a, c2 -> b, c3 -> c)
Map(c1 -> d, c2 -> e, c3 -> f)
Map(c4 -> g, c5 -> h)
Map(c4 -> i, c5 -> j)

文件非常大,因此无法将所有内容读入内存。现在我有一个Iterator类之间保持一些丑陋的状态hasNext() and next();我还提供了当前行号和实际最后一行的访问器以及读取的注释(以防消费者关心字段顺序)。我想尝试以更实用的方式做事。

我的第一个想法是 for 理解:我可以迭代文件的行,使用过滤子句跳过注释行。我可以yield包含地图、行号等的元组。问题是我需要记住最后看到的列名,以便我可以从中创建地图。 For 循环试图阻止保持状态,这是可以理解的,只让你设置新的vals。我从中学到了这个问题 https://stackoverflow.com/questions/7087353/can-a-scala-for-loop-modify-variables-outside-its-scope我可以更新成员变量yield阻止,但就在那时我don't我想更新它们!

我可以在迭代子句中调用一个更新状态的函数,但这看起来很脏。那么,以函数式风格实现此目的的最佳方法是什么?滥用理解力?黑客scanLeft https://stackoverflow.com/questions/4469538/maintaining-a-state-throughout-a-scala-fold-operation?使用图书馆?拿出来解析器组合器 https://stackoverflow.com/questions/5063022/use-scala-parser-combinator-to-parse-csv-files大枪?或者函数式风格并不能很好地解决这个问题?


状态 Monad FTW!

事实上,我很讨厌 State monad。我花了很长时间写这篇文章,我有一种强烈的感觉,它可以做得更好。特别是,在我看来traverse这是要走的路,但是...

// Get Scalaz on the job
import scalaz._
import Scalaz._

// Some type aliases to make stuff clearer
type Input         = Stream[String]
type Header        = String
type InternalState = (Input, Header)
type Output        = Option[(Header, String)]
type MyState       = State[InternalState, Output]

// Detect headers
def isHeader(line: String) = line(0) == '#'

// From a state, produce an output
def makeLine: (InternalState => Output) = {
    case (head #:: _, _) if isHeader(head) => None
    case (head #:: _, header)              => Some(header -> head)
    case _                                 => None
}

// From a state, produce the next state
def nextLine: (InternalState => InternalState) = {
    case (head #:: tail, _) if isHeader(head) => tail -> head
    case (_ #:: tail, header)                 => tail -> header
    case _                                    => Stream.empty -> ""
}

// My state is defined by the functions producing the next state
// and the output
val myState: MyState = state(s => nextLine(s) -> makeLine(s))    

// Some input to test it. I'm trimming it to avoid problems on REPL
val input = """#c1,c2,c3
a,b,c
d,e,f
#c4,c5
g,h
i,j""".lines.map(_.trim).toStream

// My State/Output Stream -- def to avoid keeping a reference to the head
def stateOutputStream = Stream.iterate(myState(input, "")){ 
        case (s, _) => myState(s) 
    } takeWhile { case ((stream, _), output) => stream.nonEmpty || output.nonEmpty }

// My Output Stream -- flatMap gets rid of the None from the headers
def outputStream = stateOutputStream flatMap { case (_, output) => output }

// Now just get the map
def outputToMap: (Header, String) => Map[String, String] = {
    case (header, line) =>
        val keys = header substring 1 split ","
        val values = line split ","
        keys zip values toMap
}

// And this is the result -- note that I'm still avoiding "val" so memory
// won't leak
def result = outputStream map outputToMap.tupled
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scala:以功能方式迭代 CSV 文件? 的相关文章

  • Scala 隐式转换范围问题

    采取这个代码 class Register var value Int 0 def getZeroFlag Boolean value 0x80 0 object Register implicit def reg2int r Regist
  • Rails csv 格式的原始查询,通过控制器返回

    我使用 Active Record 来获取我的故事 然后生成 CSV 这是在 Rails Cast 中完成的标准方法 但我有很多行 需要几分钟 我想如果我能让 posgresql 来做 csv 渲染 那么我可以节省一些时间 这是我现在所拥有
  • Map 和 Set 的实际类(不是抽象类,也不是特征类)是什么?

    在 Scala 中 映射和集合文字可以通过以下方式创建 val m Map 1 gt a 以及引用的类型m字面意思都是Map Int String 然而 scala文档表明Map实际上是一个特征 具有需要实现才能实例化的抽象成员 scala
  • 在 AKKA 中,对主管调用 shutdown 是否会停止其监督的所有参与者?

    假设我有一位主管连接了 2 位演员 当我的应用程序关闭时 我想优雅地关闭这些参与者 调用supervisor shutdown 是否会停止所有参与者 还是我仍然需要手动停止我的参与者 gracias 阻止主管 https github co
  • 将 csv 中的选定列转换为字典

    我有一个名为 archive 的 csv 文件 它以读者身份打开 我希望创建一个字典 其值 k v 是由 row 0 row 2 row 7 对于 csv 文件中的每一行 必须有一种简单直接的方法可以将此 csv 转换为字典 其中k row
  • 使用 lift-json 反序列化具有 Map[String,Any] 属性的案例类

    几天来我一直在努力解决一些通过 lift json 应该很简单的事情 将映射序列化为 JSON 我知道 我知道 根对象还不能是 List 或 Map 但我愿意暂时包装在一个案例类中 但我仍然无法让它工作 感谢一些堆栈溢出帮助 我已经可以进行
  • 降低计算精度以加快执行速度

    我有一个数据采集系统 可以进行几分钟的测量并生成一个包含 1000 万行和 10 列的 csv 文件 然后我在Python csv reader 中导入这个csv文件 对获取的数值数据执行一系列操作 但一次 只能 10000行 否则计算机内
  • Scala 将集合转变为按键映射的最佳方法?

    如果我有一个收藏c类型的T并且有一个属性p on T 类型P 说 最好的方法是什么按提取键映射 val c Collection T val m Map P T 一种方法如下 m new HashMap P T c foreach t gt
  • 无法将包含数据的大型 CSV 文件转换为 mysql 数据库[重复]

    这个问题在这里已经有答案了 如何将大型文本文件转换为mysql数据库 文件大小3GB 1100万行 文件中的每一行都是这样的 1303179444 20 5811 Ahmed Al Emam male ahmed e alemam ahme
  • 熊猫 groupby 到 to_csv

    想要将 Pandas groupby 数据帧输出到 CSV 尝试了各种 StackOverflow 解决方案 但都没有奏效 Python 3 6 1 熊猫0 20 1 groupby 结果如下所示 id month year count w
  • 为 Apache Spark 示例运行 Cypher (CAPS)

    我知道这是一个广泛的问题 但这会对neo4j不属于某个领域的用户scala编程 我需要使用Apache Spark 项目的 Cypher https github com opencypher cypher for apache spark
  • Python 将列表中的字符串转换为数字

    我遇到了以下错误消息 以 10 为基数的 int 的文字无效 2 2 外部用单引号括起来 内部用双引号括起来 该数据位于primes列出使用print primes 0 样本数据在primes list 2 3 5 7 The primes
  • 递归与迭代算法

    我正在实现欧几里德算法来查找两个整数的 GCD 最大公约数 给出了两个示例实现 递归和迭代 http en wikipedia org wiki Euclidean algorithm Implementations http en wik
  • 在 React 中过滤数据的最佳方法是什么?

    我正在建立该国餐馆的目录 该 API 返回一组对象 每个对象都包含诸如restaurantName restaurantLocation restaurantPriceRange 等字段 我想创建一个过滤组件 它将餐厅数组减少到仅包含那些符
  • 具有定期更新的静态数据集的结构化流

    将流媒体与静态数据集合并是结构化流媒体的一个重要功能 但在每个批次中 数据集都会从数据源刷新 由于这些源并不总是那么动态 因此在指定的时间段 或批次数 内缓存静态数据集会提高性能 在指定的时间段 批次数之后 将从源重新加载数据集 否则从缓存
  • Scala 中的模式匹配是如何在字节码级别实现的?

    Scala 中的模式匹配是如何在字节码级别实现的 是不是像一系列if x instanceof Foo 构造 还是其他什么 它对性能有何影响 例如 给出以下代码 来自Scala 示例 http www scala lang org docu
  • RxJS 比命令式更快吗? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我对函数式编程和函数式反应式编程比较陌生 我读了很多遍函数式反应式编程的强大力量 好的 可读 避免副作用等 但是 我不知道如何以功能
  • Scala 函数作为对象与类

    trait MyFunctionTrait extends Int Int gt Double class MyFunction1 extends MyFunctionTrait override def apply a Int b Int
  • 发送 FakeRequest 时如何为 akka.stream.Materializer 提供隐式值?

    我正在尝试理解下面看到的错误 并学习如何修复它 could not find implicit value for parameter materializer akka Stream Materializer val fut Future
  • 单击“发送”按钮事件时,我们可以在哪里获取 xml/元数据格式的表单数据?

    我是一个新的 scala 学习者 作为要求的一部分 我需要将表单数据插入 activemq 队列中以进行提交事件 我尝试调试发送方法代码 以了解单击 FormRunnerActions scala 类中的发送按钮时我们到底在哪里获取 xml

随机推荐

  • 如何以反应形式获取下拉列表的选定值

    我正在尝试获取要在反应式表单提交时发送的更改事件下拉列表的选定值 根据来自的答案 我有一个非常相似的无线电工作场景如何以反应形式获取无线电的选定值 https stackoverflow com questions 48471846 how
  • 在js中找到多边形的中心点

    我找到了一个不错的example http local wasp uwa edu au pbourke geometry polyarea 如何找到多边形的中心点 在 JS 中 http local wasp uwa edu au pbou
  • 动态 ResourceBundle 键的 EL 中的字符串串联

    我有一个资源包 其中包含如下条目 entry1 value1 entry2 value2 entry3 value3 在我的 JSF 页面中 我尝试动态使用这些键 条目的 ID 来自托管 bean 我认为应该是这样的
  • preg_match_all - 正则表达式查找字符串中的完整网址

    我花了 4 个多小时试图为我的 php 代码找到正则表达式模式 但没有运气 我有一个带有 html 代码的字符串 它有很多 url 格式 例如 example com http example com http www example co
  • 在对 pandas 数据帧进行子集化时忽略 KeyError

    我有一个带有列的 pandas 数据框 dfcity1 city2 city3 city4 city5 我有一个清单my cities city1 city3 city10 我想根据中的列对 df 进行子集化my cities 当我做 my
  • 在 MatLab 中将矩阵的列与 3d 矩阵的 2d 矩阵切片相乘

    基本上 我想执行以下计算 G is m x n x k S is n x k Answer zeros m d for Index 1 k Answer Index G Index S Index end 因此 答案是一个矩阵 其列是 3d
  • 如何在 C++ 中读取带有逗号分隔值的流?

    我想强调一个基本问题 假设您有一个 CSV 文件并使用输入标题填充单元格 该代码应从 csv 文件读取此内容并将结果写入 csv 文件 最好还对输出案例总数以及案例平均值进行编码 这是一个示例表单 我想看看如何有效地采用它来完成这个基本示例
  • ggplot 具有不同页面布局的一份 pdf 的绘图列表

    我想生成一个包含许多页 ggplots 的 pdf 文件 使用gridExtra 我还可以用 a 构建一个绘图页面m x n布局 m一排排的地块 n地块列 功能ggsave允许我写一页图 甚至是那些用gridExtra拥有m x n lay
  • 使用 AJAX 加载异地内容

    我正在构建一个 PHP 页面 它将把一些场外内容加载到 DIV 中 页面上还有其他静态元素 我遇到的问题是页面加载时间太长 因为 PHP 在显示页面之前加载站外内容 我正在考虑通过 AJAX 加载 DIV 中的场外内容 我假设无论 AJAX
  • 多部分 POST 请求 Google Glass

    我正在尝试使用多部分编码将附件添加到我的时间线 我一直在做类似以下的事情 req urllib2 Request url data body header header resp urllib2 urlopen req read 它对于 a
  • 在 LaTeX 文档中使用 tikzDevice 和 knit 进行 R 绘图

    我在使 ggplot2 tikzDevice 和 knit 一起工作时遇到问题 我正在使用 RStudio 并尝试在 Latex 文档中包含一些 R 图形 我用了一个非常简单的例子 documentclass article begin d
  • 韩国 Google 地图样式

    我有一个网站 我使用了样式化的谷歌地图 如果您将地图移至韩国 则没有地图特征 道路 高速公路 地点 只有命名城市和一些自治市边界 如果我删除样式 所有这些功能都会恢复 我对哪个功能进行样式设置似乎并不重要 这种情况在应用第一个更改时就会发生
  • 如何在 Mac OS 安装上停止 MySQL?

    我通过安装MySQLMacPorts http en wikipedia org wiki MacPorts 我需要什么命令来停止服务器 我需要测试当 MySQL 死机时我的应用程序的行为 根据您是否安装 有不同的情况MySQL http
  • 模板对象的模板友元函数和命名空间

    在以下 C 示例代码中 GCC 6 和 Clang 3 8 对正确行为的看法不一致 这个人为的例子 有效 如test 函数返回o p在海湾合作委员会 在 clang 中 它调用 未定义 函数get
  • 在 Dragenter 事件期间获取文件名

    我正在用 JavaScript 和 HTML 开发一个交互式文件上传器 我需要在其中访问当前拖动文件的文件名 触发 Dragenter 事件的文件名 但有一个问题 事件dataTransfer成员不包含任何文件 而我really在抛出 dr
  • 为什么 concat-stream 不能与 process.stdin.pipe() 一起使用?

    这是我的代码 var concat require concat stream process stdin pipe concat function console log output 我期望这样做的是每次在控制台中输入输入时输出 输出
  • 如何在微调器中允许无限整数值?

    我需要一个Spinner http en wikipedia org wiki Spinner 28computing 29用户可以在其中选择的小部件integer具有一定步长且没有下限或上限的值 我的意思是 它们至少应该在十亿范围内 所以
  • django admin 对外键字段列表进行排序

    django 管理视图中是否有用于外键字段排序的选项 即我有一个 School 模型的外键 它显示为下拉列表 按 pk 排序 我希望它按字母顺序排序 ModelAdmin具体订购通过formfield for foreignkey http
  • 如何添加 Angular $http 事件监听器

    我目前正在以角度指令上传文件 var fd new FormData fd append uploadedFile scope uploadedFile var xhr new XMLHttpRequest xhr upload addEv
  • Scala:以功能方式迭代 CSV 文件?

    我有 CSV 文件 其中包含给出列名称的注释 其中列在整个文件中发生变化 c1 c2 c3 a b c d e f c4 c5 g h i j 我想提供一种方法来迭代 仅 文件的数据行作为列名到值 所有字符串 的映射 所以上面的内容就变成了