2016-10-11 3 views
0

최근에 하스켈을 배우기 시작했으며 텍스트 파일을 해석하는 방법을 생각해 내는데 어려움을 겪고 있습니다.하스켈 파일 읽기 및 값 찾기

나는 .txt 파일을 다음 있습니다 :

ncols   5 
nrows   5 
xllcorner  809970 
yllcorner  169790 
cellsize  20 
NODATA_value -9999 
9 0 0 0 0 
0 1 0 0 0 
0 0 0 0 0 
0 0 0 0 0 
0 2 0 0 3 

최초의 6 선 단지 GIS 소프트웨어에서 파일 작업을 할 때 내가 필요한 몇 가지 정보를 표시합니다. Haskell에서 아래 숫자로 작업하려고하면 실제 거래가 시작됩니다.

하스켈에게 숫자 9, 1, 2, 3이 어디에 있는지 찾아보고 그 번호가 실제로있는 행과 열의 번호를 다시 인쇄하라고합니다. 이 경우 하스켈 인쇄해야합니다 :

The value 9 is in row 1 and column 1 
The value 1 is in row 2 and column 2 
The value 2 is in row 5 and column 2 
The value 3 is in row 5 and column 5 

내가 어떤 성공하지 자습서 및 기타 하스켈 스크립트에서 솔루션 (또는 파일을 해석하기위한 적어도 유사한 방법)을 찾는 시도, 그래서 어떤 도움을 크게 감상 할 수있다.

답변

3

다음은 원하는 작업을 수행하는 스크립트의 예입니다. 이것은 현재의 형태로 정상적으로 실패하지 않는다는 점에 유의하십시오 (그러나 이것이 스크립트 인 경우이 문제가 의심 스럽습니다). 파일 끝 부분에 줄 바꿈 줄이 있는지 확인하십시오!

import Control.Monad (replicateM, when) 
import Data.Traversable (for) 
import System.Environment (getArgs) 

main = do 

    -- numbers we are looking for 
    numbers <- getArgs 

    -- get the key-value metadata 
    metadata <- replicateM 6 $ do 
    [key,value] <- words <$> getLine 
    return (key,value) 

    let Just rows = read <$> lookup "nrows" metadata 
     Just cols = read <$> lookup "ncols" metadata 

    -- loop over all the entries 
    for [1..rows] $ \row ->do 
    rawRow <- words <$> getLine 
    for (zip [1..cols] rawRow) $ \(col,cell) -> 
     when (cell `elem` numbers) 
     (putStrLn ("The value " ++ cell ++ " is in row " ++ show row ++ " and column " ++ show col)) 

찾고자하는 숫자를 명령 줄 인수로 전달한 다음 데이터 파일로 입력하십시오.

$ ghc script.hs 
$ ./script 9 1 2 3 < data.txt 

질문이 있으시면 알려주세요.


고정 된 숫자 세트 또는 0이 아닌 숫자를 찾으려는 경우 정말 잘 모르겠습니다. 귀하의 질문에 대한 질문으로 이전, 그게 내가 한 것입니다.

+0

정말 고마워요, 당신은 생명의 은인입니다! 한 가지 더 궁금한 점이 있는데, 데이터와 숫자를 정확히 어디에서 공급해야합니까? 예를 들어 data <- getData "test.txt"를 사용하면 오류가 발생합니다. – EvilHappyHippo

+0

몇 가지 설명을 추가했습니다. 이 파일은 표준 입력으로 예상되므로 일부 쉘 명령은 요일을 저장할 수 있습니다. – Alec

+0

다시 한 번 감사드립니다. 이것은 정말 많은 도움이되었습니다! 마지막 질문 : GHCi에서 스크립트를 컴파일 한 후 자동으로이를 수행 할 수있는 방법이 있습니까? 건배! – EvilHappyHippo