2012-10-30 23 views
1

我有一个文本文件,其中每行包含两个列表。每个列表可以包含任意数量的字母数字参数。 例如[t1,t2,...] [m1,m2,...] 我可以将文件读入ghc,但是如何将它读入另一个主文件以及主文件如何分别识别每个参数然后处理它?如何将文本文件读入haskell程序?

+6

你有什么试过?您是否查看过任何Haskell教程或文档的相关部分? –

+0

[This](http://www.learnyouahaskell.com/)是一本帮助你学习Haskell的好书。它在I/O方面有很好的一章。 –

回答

2

我认为最好让你自己弄清楚大部分情况,但我已经为你提供了一些指导。 首先,尽量不要处理文件访问,直到你有其他的代码工作,否则你可能会在所有地方都有IO。从一些样本数据:

sampleData = "[m1,m2,m3][x1,x2,x3,x4]\n[f3,f4,f5][y7,y8,y123]\n[m4,m5,m6][x5,x6,x7,x8]" 

在你的代码不应该提sampleData其他地方,但你应该在ghci中使用它进行测试。

一旦你有,你想要做的一切,例如processLists::String->[(String,String)]功能,你可以用

readInLists :: FilePath -> IO [(String,String)] 
readInLists filename = fmap processLists (readFile filename) 

replcae readFile "data.txt" :: IO String如果fmap是没有意义的,你可以阅读tutorial I accidentally wrote

如果他们真的是字母数字,你可以很容易地拆分它们。这里有一些方便的功能,附带示例。

tail :: [a] -> [a] 
tail "(This)" = "This)" 

你可以用它在你的字符串前面扔掉你不想要的东西。

break :: (Char->Bool) -> String -> (String,String) 
break (== ' ') "Hello Mum" = ("Hello"," Mum") 

所以break使用测试,以找出第二个字符串的第一个字符,而之前它打破了字符串。 请注意,中断字符仍然存在于下一个字符串的前面。 span是相同的,但使用什么有在第一列表中的测试,所以

span :: (Char->Bool) -> String -> (String,String) 
span (/= ' ') "Hello Mum" = ("Hello"," Mum") 

您可以使用这些东西的功能,如(==','),或isAlphaNum(你必须import Data.Char在你的文件的顶部使用它)。

你可能想看看我在this answer中的功能splitWithsplitOn。它们基于Prelude的splitwords的定义。

+2

你“不小心”写了一篇教程?这是如何发生的? = p –

+2

@代码大师我写了一个答案,它变得非常失控。它比我典型的答案更长,现在甚至有一个附录。它只是一个简短的例子,但最终成为了一个教程。好吧。 – AndrewC

+3

答案和教程密钥就像是紧挨着一样。 –