В Scala, как прочитать простой CSV-файл с заголовком в первой строке? - PullRequest
32 голосов
/ 01 сентября 2010

Задача состоит в том, чтобы искать конкретное значение поля (по номеру в строке) по значению ключевого поля в простом файле 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()

в этом случае вопрос состоит в том, как пропуститьстрока заголовка от разбора?

Ответы [ 3 ]

30 голосов
/ 01 сентября 2010

Вы можете просто использовать drop:

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

Из документации :

def drop (n: Int) : Iterator[A]: Продвигает этот итератор мимо первого n элементов, или длина итератор, в зависимости от того, что меньше.

12 голосов
/ 01 сентября 2010

Вот CSV-ридер в Scala . Хлоп.

Кроме того, вы можете найти CSV-ридер в Java и вызвать его из Scala.

Правильный анализ файлов CSV не является тривиальным вопросом. Кавычки, для начала.

2 голосов
/ 28 апреля 2014

Сначала я читаю строку заголовка, используя 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
  }
}
...