我有一个文本文件,每行包含两个列表。每个列表可以包含任意数量的字母数字参数。 例如[t1,t2,...] [m1,m2,...] 我可以将文件读入ghc,但是如何将其读入另一个主文件中,主文件如何分别识别每个参数然后处理它?
答案 0 :(得分: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)]
,你就可以用{/ 1>重新发送readFile "data.txt" :: IO String
readInLists :: FilePath -> IO [(String,String)]
readInLists filename = fmap processLists (readFile filename)
如果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中的splitWith
和splitOn
函数。它们基于Prelude中split
和words
的定义。