반응형
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
반응형
'programing' 카테고리의 다른 글
사이트에 사진을 업로드하고 저장하는 가장 좋은 방법은 무엇입니까? (0) | 2021.01.16 |
---|---|
openssl을 요구하거나 OpenSSL을 설치하고 ruby (권장)를 다시 빌드하거나 HTTPS가 아닌 소스를 사용할 수 없습니다. (0) | 2021.01.16 |
PHP에서 날짜별로 파일 정렬 (0) | 2021.01.16 |
Swift에서 문자열을 CGFloat로 변환 (0) | 2021.01.16 |
Cordova 빌드 iOS 오류 : 'path / to / myApp.xcarchive'경로에서 아카이브를 찾을 수 없습니다. (0) | 2021.01.16 |