Как получить первую строку из файла в Scala - PullRequest
4 голосов
/ 15 января 2012

Я хотел бы получить только первую строку из CSV-файла в Scala, как бы я поступил без использования getLine (0) (это устарело)?

Ответы [ 4 ]

10 голосов
/ 15 января 2012

Если вы хотите закрыть файл и получить пустую коллекцию, а не выдавать ошибку, если файл на самом деле пуст, тогда

val myLine = {
  val src = Source.fromFile("myfile.csv")
  val line = src.getLines.take(1).toList
  src.close
  line
}

- это самый короткий способ сделать этоесли вы ограничитесь стандартной библиотекой.

10 голосов
/ 15 января 2012

Если вы не заботитесь об освобождении файлового ресурса после его использования, очень удобен следующий способ:

Source.fromFile("myfile.csv").getLines.next()

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

FWIW, вот что я хотел бы сделать (придерживаясь стандартной библиотеки):

def firstLine(f: java.io.File): Option[String] = {
  val src = io.Source.fromFile(f)
  try {
    src.getLines.find(_ => true)
  } finally {
    src.close()
  }
}

На что обратить внимание:

  1. Функция возвращает Option[String] вместо List[String], поскольку она всегда возвращает один или ни одного. Это более идиоматическая Скала.
  2. src должным образом закрыт, даже если есть вероятность, что вы сможете открыть файл, но чтение выдает исключение
  3. Использование .find(_ => true) для получения первого элемента Iterator не дает мне хорошего самочувствия, но нет метода nextOption, и это лучше, чем преобразование в промежуточный List, который вы не используете .
  4. IOException s открытие или чтение файла передаются вместе.

Я также рекомендую использовать библиотеку scala-arm , чтобы предоставить вам лучший API для управления ресурсами и автоматического закрытия файлов при необходимости.

import resource._

def firstLine(f: java.io.File): Option[String] = {
  managed(io.Source.fromFile(f)) acquireAndGet { src =>
    src.getLines.find(_ => true)
  }
}
1 голос
/ 27 апреля 2018

Я думаю, что все другие решения либо читают во всех строках, а затем сохраняют только первую строку, либо не закрывают файл. Решение, которое не имеет этих проблем:

val firstLine = {
  val inputFile = Source.fromFile(inputPath)
  val line = inputFile.bufferedReader.readLine
  inputFile.close
  line
}

У меня всего 1 неделя опыта работы со Scala, так что поправьте меня, если я ошибаюсь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...