File Haskell文件读取和查找值

File Haskell文件读取和查找值,file,haskell,multiple-columns,rows,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,我很难理解如何解释文本文件

我有以下.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脚本中找到解决方案(或至少是解释文件的类似方法),但没有成功,因此非常感谢您的帮助。

下面是一个脚本示例,可以实现您想要的功能。请注意,这将在其当前的形式不会优雅地失败(但鉴于这是一个脚本,我怀疑这是一个问题)。确保文件末尾有一个尾随换行符

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))
import Control.Monad(复制项,何时)
导入数据。可遍历(用于)
导入System.Environment(getArgs)
main=do
--我们正在寻找的数字

数字下面是一个脚本示例,可以执行您想要的操作。请注意,这将在其当前的形式不会优雅地失败(但鉴于这是一个脚本,我怀疑这是一个问题)。确保文件末尾有一个尾随换行符

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))
import Control.Monad(复制项,何时)
导入数据。可遍历(用于)
导入System.Environment(getArgs)
main=do
--我们正在寻找的数字

非常感谢你,你是个救星!还有一个问题,我到底应该在哪里输入数据和数字?如果我使用例如:数据添加了一些描述。该文件应作为标准输入,因此一些shell命令可以节省时间。再次感谢您。这真的帮了我很大的忙!最后一个问题:在GHCi中编译脚本后,是否有任何方法可以自动执行此操作?干杯@GHCi中的EvilyHappyHippo可能有点烦人-我真的建议您使用GHC编译它,然后运行它。问题是,我知道没有简单的方法可以重定向GHCi文件中的输入。非常感谢你,你是个救星!还有一个问题,我到底应该在哪里输入数据和数字?如果我使用例如:数据添加了一些描述。该文件应作为标准输入,因此一些shell命令可以节省时间。再次感谢您。这真的帮了我很大的忙!最后一个问题:在GHCi中编译脚本后,是否有任何方法可以自动执行此操作?干杯@GHCi中的EvilyHappyHippo可能有点烦人-我真的建议您使用GHC编译它,然后运行它。问题是,我知道没有简单的方法可以重定向GHCi文件中的输入。