2017-01-18 10 views
0

Я пытаюсь прочитать файл с ftp-сервера, используя потоки alpakka и scala. Тип, который я получаю от Ftp.fromPath(...), составляет Source[ByteString, Future[IOResult]]. Я бы хотел прочитать файл строки за строкой (это файл CSV), но я не знаю, как это сделать.Akka поток от ftp, строка за строкой

Буду благодарен за любую помощь.

+0

Можете ли вы показать немного больше кода, чем это? –

ответ

3

Существует стандартный способ разделить Source[ByteString, _] линиями, называемыми . Он может быть использован как это:

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 нет новой строки файл.

Источник, если материализован, будет производить ByteString s, соответствующий каждой строке, без символа новой строки. Если вы ожидаете, что ваши файлы будут содержать разделители строк Windows («\ r \ n»), вам придется обрезать эти строки вручную.