web-dev-qa-db-fra.com

Dans Scala, comment lire un simple fichier CSV ayant un en-tête sur sa première ligne?

La tâche consiste à rechercher une valeur de champ spécifique (par son nombre en ligne) par une valeur de champ clé dans un fichier CSV simple (juste des virgules comme séparateurs, pas de guillemets entourant le champ, jamais une virgule à l'intérieur d'un champ), ayant un en-tête dans sa première ligne.

L'utilisateur uynhjl a donné un exemple (mais avec un caractère différent comme séparateur):


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

la question dans ce cas est de savoir comment ignorer une ligne d'en-tête de l'analyse?

32
Ivan

Vous pouvez simplement utiliser drop:

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

De la documentation :

def drop (n: Int) : Iterator[A]: avance cet itérateur au-delà des premiers n éléments, ou de la longueur de l'itérateur, la plus petite des deux.

32
Travis Brown

Voici un lecteur CSV dans Scala . Oui.

Alternativement, vous pouvez rechercher un lecteur CSV en Java , et l'appeler depuis Scala.

L'analyse correcte des fichiers CSV n'est pas une mince affaire. Échapper aux citations, pour commencer.

14
Robert Harvey

J'ai d'abord lu la ligne d'en-tête en utilisant take(1), puis les lignes restantes sont déjà dans l'itérateur src. Cela fonctionne bien pour moi.

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