2017-04-19 2 views
2

파일 스트림 처리를 둘러보기 위해 노력하고 있습니다. 다음과 같이 입력했습니다 :파일 반복, 패턴으로 나누기

bla 
blubb 

blubber 
testcode 

위와 같이 여러 파일이 있습니다. 지금, 나는 메모리에 전체 파일을 읽고 그것을 분할하는 하나의 파일 접근 방식 사용하고 있습니다 :

Files.newBufferedReader("myfile").use { f -> 
    f.readText().splitToSequence("\n\n").forEach { 
     // do my stuff 
    } 
} 

을 지금을, 나는 더 큰 입력 (이 비현실적에서 파일을 개최하고이를 일반화하기 위해 노력하고있어 메모리) 및 여러 파일. 이상적으로는, 입력 파일의 전체 디렉토리를 \n\n으로 분할 된 라인의 단일 스트림으로 취급하고 부품을 처리해야합니다. 어떻게하면 좋을까요?

+0

Ilia의 대답으로 어려운 Kotlin 부분을 해결했지만 필자는 "InputStreamReader (SequenceInputStream (com.google.common.collect.Iterators.asEnumeration)")를 사용하여 "파일의 디렉터리를 줄의 스트림으로 처리"를 해결했습니다. (Files.list ("myDir"). map {Files.newInputStream (it)} .iterator())), Charsets.US_ASCII) .useLines {...}' – mabi

답변

4

당신은 텍스트 행의 순서로 파일을 읽고 다음 구분 기호로 빈 줄을 가지고 그 라인을 재편성 할 수 있습니다 각 요소는을이고 여기에

File("myfile").useLines { lines -> 
    val lineBlocks: Sequence<List<String>> = buildSequence { 
     val block = mutableListOf<String>() 
     for (line in lines) { 
      when { 
       line.isNotEmpty() -> block.add(line) 
       block.isNotEmpty() -> { 
        yield(block.toList()) 
        block.clear() 
       } 
      } 
     } 
     if (block.isNotEmpty()) yield(block.toList()) 
    } 

    lineBlocks.forEach { 
     println(it.joinToString()) 
    } 
} 

당신이 lineBlocks에 결과를 얻을 시퀀스입니다 단일 블록의 행 목록.

+0

코 루틴으로 이동하십시오! 그리고 '언제'의 영리한 적용에 감사드립니다. – mabi