我必須解決以下問題。我可以在Haskell中同時處理多個文件嗎?
有許多文件,比方說3爲例,其內容如下
文件1
A1
A2
A3
A4
A5
A6
......
file2的
B1
B2
B3
B4
B5
B6
......
file3的
C1
C2
C3
C4
C5
C6
......
我的程序必須採取的文件名參數,讀取這些文件和打印以下結果
「A1 B1 c1「
」a2 b2 c2「
」a 3 B3 C3"
「A4 B4 C4」
「A5 B5 C5」
「A6 B6 C6」
......
我已經寫了一個版本的程序,但它首先讀取所有文件,這是非常不利的,因爲這些文件可以是200Mb的大小。
如何編寫一個程序來檢索每個文件中的一行並顯示我的匹配,然後再轉到文件中的以下行。這肯定會避免加載所有的文件,並充分利用垃圾收集器?
個人資料圖片
對不起,我不知道如何在此處插入圖片,它總是失敗,但在分析,內存使用情況看起來像從上樓梯底部
好吧它的工作1
感謝您的回覆
回答
由於FUZxxi他的回答真的幫我,但有一個問題,當文件不具有相同數量的行,要解決這個問題,我重新寫他的節目這樣
printLines :: [[String]] -> IO()
printLines [] = return()
printLines ss = do
ss' <- printFirstLine ss
if and $ map null ss' then putStrLn "finish" else printLines ss'
printFiles :: [FilePath] -> IO()
printFiles paths = do
files <- mapM readFile paths
let fileLines = map lines files
printLines fileLines
sliceFirstRow :: [[String]] -> ([String],[[String]])
sliceFirstRow list = unzip $ map getFirst list
printFirstLine :: [[String]] -> IO ([[String]])
printFirstLine ss = do
let (fline,lline) = sliceFirstRow ss
mapM_ putStrLn fline
return lline
getFirst :: [String] -> (String, [String])
getFirst [] = ("",[])
getFirst (x:xs) = (x,xs)
再次感謝
某些IO(例如readFile)很懶。你確定你已經擁有的內存太多嗎?你測試過了嗎? – 2010-09-24 23:04:51
這是功課嗎? – fuz 2010-09-25 01:50:22