Haskell文件读取和查找值

时间:2016-10-11 04:47:42

标签: file haskell multiple-columns rows

我最近开始学习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行只显示在GIS软件中处理文件时需要的一些信息。当我尝试在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脚本中找到解决方案(或至少类似的解释文件的方法),但没有任何成功,所以非常感谢任何帮助。

1 个答案:

答案 0 :(得分: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

如果您有任何疑问,请与我联系!

我不确定你是否只想查找一组固定数字或任何非零数字。正如你的问题要求前者,这就是我所做的。