在 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 文件?的主要内容,如果未能解决你的问题,请参考以下文章