Нужна помощь в разборе файла и создании карты в Scala - PullRequest
1 голос
/ 16 января 2012

Мне трудно разобраться, как разобрать CSV-файл и опубликовать его в веб-сервисе с помощью scala.

Основная идея заключается в том, что мне нужно создать параметры сообщения из файла CSV.Там для заголовка будут параметры, а следующие строки будут значениями, т.е..

пример csv

firstname, lastname, age, weight, height
John, Doe, 30, 180, 72
Mary, Jane, 28, 120, 64

Это будет соответствовать параметрам firstname=John&lastname=Doe&age=30&weight=180&height=72 и т. Д.

У меня есть следующий scala для анализа данных, но я не могу понять, что делать дальше:

val lines = fromFile("runners/io/m2m/naf/ARDS.csv").getLines
      for ((line, cnt) <- lines.zipWithIndex) {
        if (cnt == 0) {
          for((header, i) <- CsvParser.parse(line).view.zipWithIndex){

          }
        }else {
          for((data, i) <- CsvParser.parse(line).view.zipWithIndex) {

          }
        }
      }

Ответы [ 2 ]

6 голосов
/ 16 января 2012

Как насчет этого?

val lines = fromFile("runners/io/m2m/naf/ARDS.csv").getLines
val header = CsvParser.parse(lines.next)
val rowMapsIterator =
  for (line <- lines)
    yield (header zip CsvParser.parse(line)).toMap

Тогда результаты будут выглядеть следующим образом:

scala> for((map, cnt) <- rowMapsIterator.zipWithIndex) println(cnt + ": " + map)
0: Map(firstname -> John, weight -> 180, lastname -> Doe, age -> 30, height -> 72)
1: Map(firstname -> Mary, weight -> 120, lastname -> Jane, age -> 28, height -> 64)

Чтобы получить этот & -разделенный формат, вместо этого вы должны сделать:

val rowStringIterator = rowMapsIterator.map(_.map { case (k, v) => k + "=" + v }.mkString("&"))

Это дает вам:

scala> for ((s, cnt) <- rowStringIterator.zipWithIndex) println(cnt + ": " + s)
0: weight=180&firstname=John&height=72&age=30&lastname=Doe
1: weight=120&firstname=Mary&height=64&age=28&lastname=Jane
0 голосов
/ 29 марта 2012

Я использовал ответ dhg, но сгладил списки, поскольку CsvParser возвращал List [List []].

Таким образом -

val header = CsvParser.parse(lines.next).flatten


val rowMapsIterator =
 |   for (line <- lines)
 |     yield (header zip CsvParser.parse(line).flatten).toMap

Это дало мне карту заголовкасопоставление столбца col с данными

scala> rowMapsIterator.foreach(println)
Map(weight -> 180, firstname -> John, height -> 72, age -> 30, lastname -> Doe)
Map(weight -> 120, firstname -> Mary, height -> 64, age -> 28, lastname -> Jane)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...