我尝试使用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文件),但我不知道如何。
我将不胜感激任何帮助。
答案 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”),则需要手动修剪这些字符串。