我试图从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:这是编译过程!
答案 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