我正在阅读一个csv文件。我正在使用Akka Streams来做这个,这样我就可以创建一个在每一行上执行的动作的图形。我已经启动并运行了下面的玩具示例。
def main(args: Array[String]): Unit = {
implicit val system = ActorSystem("MyAkkaSystem")
implicit val materializer = ActorMaterializer()
val source = akka.stream.scaladsl.Source.fromIterator(Source.fromFile("a.csv").getLines)
val sink = Sink.foreach(println)
source.runWith(sink)
}
这两个Source
类型让我很不舒服。这是惯用的,还是有更好的写法?
4条答案
按热度按时间siotufzp1#
实际上,
akka-streams
提供了一个直接从文件中读取的函数。这里,
runForeach
方法是打印行。如果你有合适的Sink
来处理这些行,就用它来代替这个函数。例如,如果你想按'
拆分行并打印其中的总字数:gcmastyq2#
使用Akka Streams读取CSV文件的惯用方法是使用Alpakka CSV connector。以下示例读取CSV文件,将其转换为列名(假定为文件中的第一行)和
ByteString
值的Map,将ByteString
值转换为String
值,并打印每一行:qvsjd97n3#
试试看:
liwlm1x94#
是的,这是可以的,因为这些是不同的
Source
。但是如果你不喜欢scala.io.Source
,你可以自己读取文件(有时我们不得不这样做,例如,源csv
文件是压缩的),然后使用给定的InputStream
解析它,如下所示话虽如此,考虑使用
Apache Commons CSV
与akka-stream。您可能最终编写更少的代码:)