web-dev-qa-db-ja.com

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

この場合の質問は、解析からヘッダー行をスキップする方法ですか?

32
Ivan

単にdropを使用できます:

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

ドキュメント から:

def drop (n: Int) : Iterator[A]:最初のn要素、または反復子の長さのいずれか小さい方を超えて、この反復子を進めます。

32
Travis Brown

ScalaのCSVリーダー です。うわぁ。

または、 JavaのCSVリーダー を探し、Scalaから呼び出すこともできます。

CSVファイルを適切に解析することは簡単なことではありません。手始めに、引用符をエスケープします。

14
Robert Harvey

最初に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
  }
}
2
tuxdna