2016-10-11 64 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 

第6行只是显示一些信息,在地理信息系统软件的文件上工作时,我需要。当我尝试在Haskell中使用下面的数字时,真正的交易就开始了。

我想告诉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

非常感谢你,你是一个救星!还有一个问题,我应该在哪里提供我的数据和数字?如果我使用例如:data < - getData“test.txt”,它只是抛出一个错误。 – EvilHappyHippo

+0

添加了一些说明。该文件预计为标准输入,因此一些shell命令可以节省一天的时间。 – Alec

+0

再一次,非常感谢。这真的帮了我很多!最后一个问题:在GHCi中编译脚本后,有什么办法可以自动完成吗?干杯! – EvilHappyHippo