В Scala, как читать простой CSV файл с заголовком в его первой строке?
Задача состоит в том, чтобы искать значение определенного поля (по его числу в строке) значением поля ключа в простом файле 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()
Вопрос в этом случае заключается в том, как пропустить строку заголовка от разбора?
Ответы
Ответ 1
Вы можете просто использовать drop
:
val iter = src.getLines().drop(1).map(_.split(":"))
В документации :
def drop (n: Int) : Iterator[A]
: Увеличивает этот итератор за первый n элементов или длины итератор, в зависимости от того, что меньше.
Ответ 2
Здесь CSV-ридер в Scala. Хлоп.
В качестве альтернативы вы можете найти CSV-ридер в Java и вызвать это из Scala.
Анализ файлов CSV должным образом не является тривиальным вопросом. Исключение кавычек, для начала.
Ответ 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
}
}