35 Stimmen

Wie liest man in Scala eine einfache CSV-Datei mit einem Header in der ersten Zeile?

Die Aufgabe besteht darin, in einer einfachen CSV-Datei (nur Kommas als Trennzeichen, keine feldeinschließenden Anführungszeichen, niemals ein Komma innerhalb eines Feldes), die in ihrer ersten Zeile eine Kopfzeile hat, nach einem bestimmten Feldwert (nach seiner Zeilennummer) zu suchen.

Der Benutzer uynhjl hat ein Beispiel gegeben (allerdings mit einem anderen Zeichen als Trennzeichen):

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

Die Frage ist in diesem Fall, wie man eine Kopfzeile beim Parsen überspringt.

0 Stimmen

Ich habe gerade eine Frage und eine umfassende Antwort geschrieben, die sowohl das Parsen der Eingabe als auch das Zusammenstellen der Ausgabe für eine CSV-Datei abdeckt. Sie ist hier zu finden: stackoverflow.com/a/32488453/501113

30voto

Travis Brown Punkte 137441

Sie können einfach Folgendes verwenden drop :

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

Von der Dokumentation :

def drop (n: Int) : Iterator[A] : Schiebt diesen Iterator über den ersten n Elemente oder die Länge der Iterators, je nachdem, was kleiner ist.

18voto

Robert Harvey Punkte 173098

Hier ist ein CSV-Leser in Scala . Igitt.

Alternativ können Sie auch nach einem CSV-Leser in Java und rufen Sie es von Scala aus auf.

Das korrekte Parsen von CSV-Dateien ist keine triviale Angelegenheit. Zunächst einmal müssen Anführungszeichen vermieden werden.

4voto

tuxdna Punkte 8017

Zuerst lese ich die Kopfzeile mit take(1) und dann sind die restlichen Zeilen bereits in src Iterator. Dies funktioniert gut für mich.

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
  }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X