【问题标题】:In Scala, how to read a simple CSV file having a header in its first line?在 Scala 中,如何读取第一行有标题的简单 CSV 文件?
【发布时间】: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()

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

【问题讨论】:

标签: parsing scala file-io csv


【解决方案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 文件并非易事。对于初学者来说,转义引号。

【讨论】:

  • 我见过这个,但对于我的简单案例来说看起来太复杂了。我不需要所有这些正则表达式,因为我的文件非常简单。
  • 我刚刚在这个 StackOverflow 答案上发布了一个更简单的解决方案(很容易复制/粘贴到本地编码上下文中):stackoverflow.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(”,") 建议:stackoverflow.com/a/32488453/501113
  • 问题是simple CSV。如果 CSV 不简单,那么对我们来说,专用的 CSV 库总是更好。
猜你喜欢
  • 2016-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-15
相关资源
最近更新 更多