在 Scala 中,如何读取第一行有标题的简单 CSV 文件?

Posted

技术标签:

【中文标题】在 Scala 中,如何读取第一行有标题的简单 CSV 文件?【英文标题】:In Scala, how to read a simple CSV file having a header in its first line? 【发布时间】:2011-04-06 13:20:17 【问题描述】:

任务是通过简单 CSV 文件中的关键字段值(仅以逗号作为分隔符,没有包含字段的引号,从不在字段内的逗号)中查找特定字段(通过它的行号)值,在第一行有一个标题。

用户 uynhjl 给出了一个示例(但使用不同的字符作为分隔符):

val src = Source.fromFile("/etc/passwd") val iter = src.getLines().map(_.split(":")) // print the uid for Guest iter.find(_(0) == "Guest") foreach (a => println(a(2))) // the rest of iter is not processed src.close()

这种情况下的问题是如何从解析中跳过标题行?

【问题讨论】:

我刚刚写了一个问题和综合答案,涵盖了解析输入和为 CSV 文件组合输出。它位于此处:***.com/a/32488453/501113 【参考方案1】:

你可以使用drop:

val iter = src.getLines().drop(1).map(_.split(":"))

来自documentation:

def drop (n: Int) : Iterator[A]: 将此迭代器推进到第一个 n 个元素,或元素的长度 迭代器,以较小者为准。

【讨论】:

读取 CSV 文件的方式不正确。 “正确解析 CSV 文件并非小事”,请参阅 CSV specification 和下一个答案。 @PeterKrauss 虽然标题侧重于 CSV 部分,但问题本身清楚地表明用户试图做的是跳过一行。 对不起,特拉维斯,这对你来说不是一个大胆的,它是为那些浪费时间寻找通用“CSV 解决方案”的 48k 综合浏览量的人准备的。似乎是Scala标准库的问题,没有标准……但是它用于以大数据为中心的项目(例如Spark)并且没有明显的CSV阅读器。【参考方案2】:

这是CSV reader in Scala。哎呀。

或者,您可以查找 CSV reader in Java,然后从 Scala 调用它。

正确解析 CSV 文件并非易事。对于初学者来说,转义引号。

【讨论】:

我见过这个,但对于我的简单案例来说看起来太复杂了。我不需要所有这些正则表达式,因为我的文件非常简单。 我刚刚在这个 *** 答案上发布了一个更简单的解决方案(很容易复制/粘贴到本地编码上下文中):***.com/a/32488453/501113 这应该是一个评论,因为它没有解决问题(如何跳过一行)。【参考方案3】:

首先我使用take(1) 读取标题行,然后其余行已经在src 迭代器中。这对我来说很好。

val src = Source.fromFile(f).getLines

// assuming first line is a header
val headerLine = src.take(1).next

// processing remaining lines
for(l <- src) 
  // split line by comma and process them
  l.split(",").map  c => 
      // your logic here
  

【讨论】:

split(",") 的问题在于,当您遇到像"This, that" 这样的字符串时,即使它是单个点的一部分,它也会将其拆分。 我刚刚在此处对 CSV 问题的全面回答中解决了非常常见且错误的“使用 split(”,") 建议:***.com/a/32488453/501113 问题是simple CSV。如果 CSV 不简单,那么对我们来说,专用的 CSV 库总是更好。

以上是关于在 Scala 中,如何读取第一行有标题的简单 CSV 文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 C 中的控制台读取一行?

在 Ruby 中读取文件的第一行

如何在 C++ 中读取文件?

从文本文件中读取第一行的 Windows 批处理命令

如何在 C 中读取和覆盖文本文件?

使用streamreader读取csv时如何跳过第一行