2016-10-11 2 views
0

最近、私はHaskellの学習を開始しましたが、テキストファイルをどのように解釈するのか苦労しています。Haskellファイルの読み込みと値の検索

私は.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 

GISソフトウェアのファイルを扱う場合、最初の6行はちょうど私が必要とするいくつかの情報を表示します。 Haskellの以下の数字で作業しようとすると、実際の取引が始まります。

私はHaskellに数字9,1,2,3がどこにあるかを調べて、それらの数字が実際にどこにある行と列の番号を返すように伝えたいと思います。この場合、Haskellは印刷する必要があります:

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 

を私は成功せず、チュートリアルや他のHaskellのスクリプトで溶液(またはファイルを解釈するための少なくとも同様の方法を)発見しようとしたので、任意の助けをいただければ幸いです。

答えて

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

ありがとう、あなたは救命救助者です!しかしもう1つの質問ですが、データと数字を正確にどこに供給すべきですか?たとえば、data < - getData "test.txt"を使用すると、エラーが返されます。 – EvilHappyHippo

+0

説明を追加しました。ファイルは標準入力と見なされるので、シェルコマンドによってはその日を節約することができます。 – Alec

+0

もう一度、ありがとうございます。これは本当に私を助けました!最後の質問:GHCiでスクリプトをコンパイルした後、これを自動的に行う方法はありますか?乾杯! – EvilHappyHippo

関連する問題