Scala Akka流:处理带有标题的CSV
-基于这个问题。 我使用Akka Streams进行CSV读取。 现在我需要逐行执行processit,但我还需要知道头的名称。 有选择吗 UPD。 澄清一下Scala Akka流:处理带有标题的CSV,scala,akka,akka-stream,Scala,Akka,Akka Stream,-基于这个问题。 我使用Akka Streams进行CSV读取。 现在我需要逐行执行processit,但我还需要知道头的名称。 有选择吗 UPD。 澄清一下 FileIO.fromPath(Paths.get("a.csv)) .via(Framing.delimiter(ByteString("\n"), 256, true).map(_.utf8String)) .runForeach(println /* header + current line for each line*/)
FileIO.fromPath(Paths.get("a.csv))
.via(Framing.delimiter(ByteString("\n"), 256, true).map(_.utf8String))
.runForeach(println /* header + current line for each line*/)
您可以使用获取第一个元素(在本例中为标题),然后将其与后续元素(行)惰性地组合
下面是一个将标题和列组合在一起形成映射[String,String]
的示例:
val flow: Flow[Seq[String], Map[String, String], NotUsed] = Flow[Seq[String]]
.prefixAndTail(1).flatMapConcat { case (headers, rows) =>
rows.map (row => headers.head.zip(row).toMap)
}
val test: Source[Seq[String], NotUsed] = Source(
List(Seq("col1", "col2"), Seq("a", "b"), Seq("1", "2")))
Await.result(test.via(flow).runForeach(println), 20.seconds)
// Map(col1 -> a, col2 -> b)
// Map(col1 -> 1, col2 -> 2)
Akka Streams连接器的集合Alpakka提供:
标题不在CSV的第一行吗?你可以添加更多关于你所面临的具体问题的细节吗?添加了我需要的示例。这个库非常棒。但是我希望你用它的头写一个csv文件:?我有你上面的代码,但是在过滤了一些行之后,我不知道如何写回它
Source
.single(ByteString("""header1,header2,header3
|1,2,3
|4,5,6""".stripMargin))
.via(CsvParsing.lineScanner())
.via(CsvToMap.toMap())
.map(_.mapValues(_.utf8String))
.runForeach(println)
// Map(header1 -> 1, header2 -> 2, header3 -> 3)
// Map(header1 -> 4, header2 -> 5, header3 -> 6)