2017-05-15 2 views
0

J'utilise Akka FileIO (in scala) pour créer un analyseur de fichier qui est destiné à lire chaque ligne à partir d'un fichier d'entrée et à appliquer un simple puits. Chaque ligne est délimitée par un caractère de nouvelle ligne ('\ n') à l'exception de la dernière ligne du fichier qui se termine par un EOF.AKKA FileIO Stream Analyser à Newline et EOF

Comment puis-je gérer à la fois la nouvelle ligne et la délimitation de l'eof afin de pouvoir lire de façon fiable la ligne finale sans avoir à dépendre d'un caractère final '/ n'?

var rowNum = 0 
    val simpleMsgSink: Sink[String, Future[Done]] = 
     Sink.foreach { 
     case row: String => { 
      println(s"$rowNum: $row") 
      rowNum = rowNum+1 
     } 
     } 
    val source = FileIO.fromPath(file, 1 * 1024 * 1024) 
     .via(Framing.delimiter(ByteString("\n"), maximumFrameLength = 1024)) 
     .map(_.utf8String) 
     .runWith(simpleMsgSink) 

Si cette option est exécutée sur le fichier (pas de nouvelle ligne à la fin de la dernière ligne):

Sensor_ID,Location,Seqno,gwrx.time,Temp,Humidity,Noise,CO2,Water 
A0890,"51.645368, 0.072211",1,42793.00278,16,48,36,325,0 
A0891,"51.645370, 0.072300",1,42793.00278,15,41,34,353,3 

La sortie est:

0: Sensor_ID,Location,Seqno,gwrx.time,Temp,Humidity,Noise,CO2,Water 
1: A0890,"51.645368, 0.072211",1,42793.00278,16,48,36,325,0 

Comment puis-je pickup cette dernière ligne ?

+0

Merci pour le tester, @chunjef. Je cours également 2.4.16. L'extrait renvoie-t-il 3 lignes de sortie? Etes-vous sûr (e) de ne pas avoir ajouté de \ n à la fin de la troisième ligne? –

Répondre

0

Si vous jetez un oeil à la scala doc de Framing.delimiter, vous verrez qu'il a fait troisième paramètre: allowTruncation avec la valeur par défaut étant false. Voici ce que scaladoc dit à ce sujet:

Si false, puis quand la dernière image décodé ne contient pas valide delimiter ce flux ne passe pas le flux au lieu de retourner un cadre tronqué.

Donc, tout ce que vous avez à faire est d'ajouter à le paramètre manquant:

Framing.delimiter(ByteString("\n"), maximumFrameLength = 1024, allowTruncation = true) 
+0

C'est parfait! J'avais déjà commencé le chemin de marquer 'faux' et essayant d'attraper une erreur mais allowTrunction = true veut juste que je veux. Merci! –