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

发布于 2024-09-16 23:29:54 字数 406 浏览 7 评论 0原文

任务是在一个简单的 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()

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

The task is to look for a specific field (by it's number in line) value by a key field value in a simple CSV file (just commas as separators, no field-enclosing quotes, never a comma inside a field), having a header in its first line.

User uynhjl has given an example (but with a different character as a separator):


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()

the question in this case is how to skip a header line from parsing?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

那一片橙海, 2024-09-23 23:29:54

您可以只使用 drop

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

来自 文档

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

You can just use drop:

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

From the documentation:

def drop (n: Int) : Iterator[A]:
Advances this iterator past the first
n elements, or the length of the
iterator, whichever is smaller.

笑饮青盏花 2024-09-23 23:29:54

这是一个 Scala 中的 CSV 阅读器。哎呀。

或者,您可以查找 Java 中的 CSV 阅读器,并从 Scala 中调用它。

正确解析 CSV 文件并不是一件小事。首先,转义引号。

Here's a CSV reader in Scala. Yikes.

Alternatively, you can look for a CSV reader in Java, and call that from Scala.

Parsing CSV files properly is not a trivial matter. Escaping quotes, for starters.

朦胧时间 2024-09-23 23:29:54

首先,我使用 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
  }
}

First I read the header line using take(1), and then the remaining lines are already in src iterator. This works fine for me.

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
  }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文