我非常喜欢哈斯克尔。我有一些数据需要处理,并认为我在haskell中做了。本质上,我获取多个文件的内容,转换它们并将新输出存储在一个文件中。每个文件都会转换为数字列表。然后,我需要在保存输出之前转置列表。我有以下内容:
main = do
allFiles <- getDirectoryContents inputDir
contents <- readFile (validFiles allFiles !! 1)
let activeCompanies = getMonthRow contents
print $ activeCompanies
getMonthRow :: String -> [String]
-- returns the needed data from the file
validFiles :: [String] -> [String]
-- removes invalid files from the list of filenames
这样可行,activeCompanies
包含应该的数字列表。作为证明,我只采用validFiles
中的第一个文件。我想要做的是读取所有文件的数据并将它们存储在一个大的列表中。它会是这样的
[["1","2","3"],["2","3","4"],["4","5","6"]]
where each sublist is the `activeCompanies` list I retrieved from one file
原因是我需要在将数据存储在输出文件(即多个输入文件,一个输出文件)之前转置数据。
我怎样才能做到这一点?我有一个想法是,对于每个文件,我可以将列表写入输出文件,每行一个元素,然后在读取输入文件时更新输出文件中的每一行。但是,我现在都是耳朵。
答案 0 :(得分:3)
我认为这应该有效。它会读取所有文件,并transposes内容getMonthRow
映射到其上。
import Data.List
main = do
allFiles <- getDirectoryContents inputDir
contents <- mapM readFile $ validFiles allFiles
print $ transpose $ map getMonthRow contents
答案 1 :(得分:2)
试试这个。它遍历所有有效文件,读取它们并应用getMonthRow
。
import Control.Monad
main = do
allFiles <- getDirectoryContents inputDir
bigList <- forM (validFiles allFiles) (fmap getMonthRow . readFile)
print bigList
更详细地说,forM
在这种情况下采用类型[String]
的列表和类型String -> IO [String]
的函数。其结果使bigList
成为[[String]]
。
fmap getMonthRow . readFile
代码段相当于辅助功能
readMonthRow :: String -> IO [String]
readMonthRow s = do
wholeFile <- readFile s
return (getMonthRow wholeFile)