从Haskell中的文件读取

时间:2014-11-16 18:29:34

标签: haskell

我试图从Haskell中的文件中读取数据,但我之后无法处理数据。

基本上,我想要做的是,读取文件,然后根据读取的数据创建一个矩阵。 但它比这更棘手。我将解释:

这是一个示例输入文件:

6 - number of lines in the matrix
7 - number of columns in the matrix
PA 3123
PB 11254
PC 790
PD 86214        
PE 114125
PF 36214

其余的就是数据本身。

现在,由于在此示例中,列数为7,因此必须按以下方式创建矩阵:

 Column 1  | Column 2  |  Column 3  |  Column 4 |  Column 5  |  Column 6  |  Column 7 

 3123/1       3123/2       3123/3       3123/4      3123/5       3123/6       3123/7

  ...          ...          ...          ...         ...          ...           ...

和其他人一样。

我已经在网站上搜索了答案,并且我已经阅读了本书Learn You a Haskell for Great Good!的某些部分,并且我能够提出这些代码:

-- Imports needed
import System.IO
import Data.List
import Data.Text


-- Runs the program
main = do
    putStrLn "Please insert the name of the file you want to process:"
    file <- getLine
    read_File file


-- Reads all file content
read_File file = do
h <- openFile file ReadMode
content <- hGetContents h
hClose h
handleFile content

-- Handles the content of the file
handleFile content = do
n1 <- getLine 
n2 <- getLine
-- here comes my big problem, how can i create the matrix properly?
putStrLn n1
putStrLn n2

此代码编译得很好,但存在问题。我在最后放了两个putStrLn,以验证文件是否正确读取,但是当我运行它时,我没有错误,但根本没有数据。

提前致谢!

PS:这是编译过程!

Compilation Process

1 个答案:

答案 0 :(得分:1)

你有两个问题:

首先,handleFile正在从标准输入读取 - 它应该处理content中的数据:

handleFile content = do
  let lns = Prelude.lines content
      (n1:n2:rest) = lns  -- first two lines
  putStrLn $ "first line is: " ++ n1
  putStrLn $ "second line is: " ++ n2

其次,这将成为一个问题:

...
h <- openFile file ReadMode
content <- hGetContents h
hClose h
handleFile content
...

hGetContents使用延迟I / O - 在需要之前不会读取数据。通过执行hClose h,您将在读取任何数据之前关闭文件句柄。

您可以在执行hClose后执行handleFile来解决此问题,例如:

content <- hGetContents h
handleFile content
hClose h

或者,您可以使用readFile而不用担心打开或关闭文件:

content <- readFile file