2017-01-15 1 views
0

현재 txt 파일을 가져 와서 해당 파일의 숫자 표를 1 열의 숫자가있는 목록으로 변환 할 수있는 프로그램을 작성하려고합니다. 2 etc.숫자를 제외한 문자열에서 모든 문자 제거

txt 파일의 구조로 인해 목록에서 숫자를 만드는 데 아무런 문제가 없지만 문제는 txt 파일에서 생성 된 문자열에서 관련이없는 부분을 제거해야하는 방법입니다. 지금과 같은

내 코드 :

let mutable s = "" 

let readerStream = System.IO.File.OpenText "x.txt" 
let readFile (stream : System.IO.StreamReader) = 
    while not(stream.EndOfStream) do 
     let mutable line = stream.ReadLine() 
     s <- s + sprintf "%s" line.ToLower() 
    stream.Close() 

readFile readerStream 
s <- s.[3600..1253900] 
printfn "%s" s 
printf "%A" (String.length s) 

내 초기 접근 방식은 숫자 이외의 문자의 모든 인스턴스를 제거하려면 string.replace를 사용했다,하지만 빠르게 지저분했고, 그 다음 나는 것을 깨달았다 텍스트 컬럼의 위와 아래에는 숫자가 들어있어 그 접근법을 쓸모 없게 만듭니다.

위에서 언급했듯이 txt 파일은 모두 비슷한 구조를 가지고 있습니다. 즉, 세 번째 마지막 줄에 표시된 것과 같이 색인을 생성하여 관련없는 텍스트를 대부분 제거한 다음 String.Replace를 사용하여 나머지 텍스트를 제거 할 수 있습니다 , 나는 내가 쓸모가 없다. 이 접근법은 효과가 있지만, 더 똑똑한 방법이 있는지 궁금합니다.

질문을 쉽게 이해하는 데 도움이되는 경우 해당 txt 파일 중 하나를 첨부했습니다.

숫자 열이 시작되고 끝나기 전에 "$$ EOE"라는 키워드가 있습니다. 이제이 사실을 활용할 수있는 방법이 있습니까?

+0

'첨부 된 텍스트 파일은 어디에 있습니까?'라는 txt 파일 중 하나를 첨부 했습니까? –

답변

2

텍스트 파일없이 답변을 제공하는 것은 어렵습니다. 곧 업로드 할 것이라고 가정합니다. 나는 그것을 찌르는 것이지만 설명과 코드는 실제로 일치하지 않습니다.

내가 제공 할 수있는 것은 컴파일하는 것을 방해하는 몇 가지 작은 공백 문제가 있으며 두 개의 불필요한 mutable 변수가 있으며, 문자열 연결의 수가 너무 많아서 a StringBuilder. 여기에 초기 깔끔한을 수 있습니다 :

let sb = StringBuilder() 

let readerStream = System.IO.File.OpenText "x.txt" 
let readFile (stream : System.IO.StreamReader) = 
    while not(stream.EndOfStream) do 
     let line = stream.ReadLine() 
     line.ToLower() |> sb.Append |> ignore 
    stream.Close() 
readFile readerStream 
let s = sb.ToString().[3600..1253900] 
printf "%s" s 
printf "%i" (String.length s) 

당신이 파일의 내용을 게시

, 나는 다른 방법에 내 생각을 제공 할 것입니다.

+1

나는 이것을 대답으로 받아 들일 것이다. 그러나 잠시 벽에 머리를 대고 나 자신을 알아 냈다. 시간을내어 주셔서 감사합니다. 정말 친절합니다. :) –