programing

F #에서 파일을 일련의 줄로 읽는 방법

copyandpastes 2021. 1. 16. 10:58
반응형

F #에서 파일을 일련의 줄로 읽는 방법


이것은 C # 버전입니다.

public static IEnumerable<string> ReadLinesEnumerable(string path) {
  using ( var reader = new StreamReader(path) ) {
    var line = reader.ReadLine();
    while ( line != null ) {
      yield return line;
      line = reader.ReadLine();
    }
  }
}

그러나 직접 번역에는 가변 변수가 필요합니다.


let readLines (filePath:string) = seq {
    use sr = new StreamReader (filePath)
    while not sr.EndOfStream do
        yield sr.ReadLine ()
}

.NET 4.0을 사용하는 경우 File.ReadLines 만 사용할 수 있습니다 .

> let readLines filePath = System.IO.File.ReadLines(filePath);;

val readLines : string -> seq<string>

이 패턴을 캡슐화하기위한 라이브러리 함수가 있는지 여부에 대한 질문에 답하기 위해- 정확히 이에 대한 함수는 없지만 라는 상태에서 시퀀스를 생성 할 수있는 함수가 있습니다 Seq.unfold. 이를 사용하여 위의 기능을 다음과 같이 구현할 수 있습니다.

new StreamReader(filePath) |> Seq.unfold (fun sr -> 
  match sr.ReadLine() with
  | null -> sr.Dispose(); None 
  | str -> Some(str, sr))

sr값은 스트림 리더를 나타내고 상태로 전달된다. null이 아닌 값을 제공 Some하는 한 생성 할 요소와 상태 (원하는 경우 변경 될 수 있음)를 포함하여 반환 할 수 있습니다 . 읽을 때 null, 우리는 그것을 폐기 None하고 시퀀스를 끝내기 위해 돌아갑니다 . StreamReader예외가 발생할 적절하게 처리되지 않기 때문에 직접적으로 동등하지 않습니다 .

이 경우, 나는 확실히 시퀀스 표현 (대부분의 경우에 더 우아하고 읽기 쉬움)을 사용할 것이지만, 고차 함수를 사용하여 작성할 수도 있다는 것을 아는 것이 유용합니다.


    let lines = File.ReadLines(path)                

    // To check
    lines |> Seq.iter(fun x -> printfn  "%s" x) 

.NET 2/3에서는 다음을 수행 할 수 있습니다.

let readLines filePath = File.ReadAllLines(filePath) |> Seq.cast<string>

및 .NET 4 :

let readLines filePath = File.ReadLines(filePath);;

"System.ObjectDisposedException : 닫힌 TextReader에서 읽을 수 없습니다."를 방지하기 위해 예외, 사용 :

let lines = seq { yield! System.IO.File.ReadLines "/path/to/file.txt" }

참조 URL : https://stackoverflow.com/questions/2365527/how-read-a-file-into-a-seq-of-lines-in-f

반응형