来自ftp的Akka流,逐行

时间:2017-01-18 12:59:48

标签: scala akka akka-stream

我尝试使用alpakka和scala流从ftp服务器读取文件。 我从;WITH CTE AS ( Select EmpNo, WorkDate, DATEDIFF(minute, '09:00:00' , Time_In ) AS TimeUnder from #timelogTB WHERE TIME_IN > '09:00:00' UNION Select EmpNo, WorkDate, DATEDIFF(minute, Time_Out, '18:00:00') AS TimeUnder from #timelogTB WHERE TIME_OUT < '18:00:00' ) SELECT EmpNo, WorkDate, Sum(TimeUnder) As TimeUnder FROM CTE GROUP BY EmpNo, WorkDate 获得的类型是EmpNo WorkDate TimeUnder 1 2017-01-01 10 1 2017-01-02 15 2 2017-01-02 30 1 2017-01-03 5 2 2017-01-03 25 。我想逐行阅读文件(它是一个CSV文件),但我不知道如何。

我将不胜感激任何帮助。

1 个答案:

答案 0 :(得分:4)

有一种标准方法可以按行分割Source[ByteString, _],称为Framing.delimiter。它可以像这样使用:

val source: Source[ByteString, Future[IOResult]] = Ftp.fromPath(...)

val splitter = Framing.delimiter(
  ByteString("\n"),
  maximumFrameLength = 1024,
  allowTruncation = true
)

val result: Source[ByteString, Future[IOResult]] = source.via(splitter)

maximumFrameLength参数确定一条线的最大长度;您可以将其设置为Int.MaxValue以获得基本上无限制的行长度(尽管如果您的CSV行非常长可能会很危险),allowTruncation设置为true以允许此情况当CSV文件末尾没有新行时。

result来源,在具体化后,将生成与每一行对应的ByteString个,而不包含换行符。如果您希望文件包含Windows行分隔符(“\ r \ n”),则需要手动修剪这些字符串。