你好,同行们。我决定用Haskell重写一些我以前写过的脚本,只是因为我需要练习和我喜欢这门语言。所以我尝试从一个大约1.7GB的文件中筛选出有兴趣的行,并将剩余的内容写入另一个文件。
我认为Haskell的惰性特性非常适合这个任务,但代码很快就会耗尽内存。之前的版本(C#或Python)采用的是读取行 -> 写入行的方法,但我在这里尝试了不同的方法。我应该重新编写代码以反映先前版本的方法,还是我错过了什么?
所以这是负责原始文件过滤的函数:
我认为Haskell的惰性特性非常适合这个任务,但代码很快就会耗尽内存。之前的版本(C#或Python)采用的是读取行 -> 写入行的方法,但我在这里尝试了不同的方法。我应该重新编写代码以反映先前版本的方法,还是我错过了什么?
所以这是负责原始文件过滤的函数:
getLines :: FilePath -> IO [[String]]
getLines path = do
text<-readFile path
let linii=lines text
let tokens = map words linii
let filtrate=[x|x<-tokens,length x>7,isTimeStamp (x!!0),isDiagFrame x]
return filtrate
这个函数负责在新文件中逐行写入文本(尽管我曾试图直接使用writeFile,但失败了):
writeLines ::Handle->[[String]]->IO ()
writeLines handle linii = do
let linie=concat $ intersperse " " (head linii)
hPutStrLn handle linie
if length linii > 0 then
writeLines handle (tail linii)
else
print "Writing complete..."
这两个函数是主要的功能,另一个函数负责获取句柄并传递它:
writeTheFile :: FilePath->FilePath->IO ()
writeTheFile inf outf = do
handle<-openFile outf WriteMode
linii<-getLines inf
writeLines handle linii
print "Write Complete"
main = do
arg<-getArgs
if length arg/=2 then
print "Use like this : trace_pars [In_File] [Out_File] !"
else
writeTheFile (arg!!0) (arg!!1)
任何建议都将不胜感激...提前致谢