2010-09-24 93 views
1

我必須解決以下問題。我可以在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的大小。

如何編寫一個程序來檢索每個文件中的一行並顯示我的匹配,然後再轉到文件中的以下行。這肯定會避免加載所有的文件,並充分利用垃圾收集器?

個人資料圖片

對不起,我不知道如何在此處插入圖片,它總是失敗,但在分析,內存使用情況看起來像從上樓梯底部

alt text

好吧它的工作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) 

再次感謝

+1

某些IO(例如readFile)很懶。你確定你已經擁有的內存太多嗎?你測試過了嗎? – 2010-09-24 23:04:51

+0

這是功課嗎? – fuz 2010-09-25 01:50:22

回答

2

我會做這樣的事情:

printFiles :: [FilePath] -> IO() 
printFiles paths= do 
    files <- mapM readFile paths 
    let fileLines = map lines files 
    printLines fileLines 
    where 
    sliceFirstRow :: [[String]] -> ([String],[[String]]) 
    sliceFirstRow list = unzip $ map helper list where 
    helper (x:xs) = (x,xs) 
    helper []  = "" -- Your behaviour here 
    printFirstLine :: [[String]] -> IO ([[String]]) 
    printFirstLine ss = do 
    let (fline,lline) = sliceFirstRow ss 
    mapM_ putStrLn fline 
    return lline 
    printLines :: [[String]] -> IO() 
    printLines [] = return() 
    printLines ss = do 
    ss' <- printFirstLine ss 
    printLines ss' 

雖然沒有測試,它應該是對記憶有益。

+0

感謝您的幫助,這不是一項家庭作業,而是我正在研究的一個項目中的一個模塊,同時測試它會出現以下錯誤。 ** test_lazy2:test_lazy2.hs:8:36-52:函數sliceFirstRow中的lambda **中的非窮舉模式,它似乎沒有采取所有可能的輸入我正在尋找哪裏出了問題,但可以你再次看到它。謝謝 – 2010-09-25 11:02:55

+0

發生這種情況,如果一行比其他行更長,請參閱更新的響應。 – fuz 2010-09-25 11:36:50

+0

您好FUZxxi,幫助函數的類型不清楚,它是幫助:字符串或助手::(字符串,[字符串]) – 2010-09-26 14:38:27

相關問題