从多个文件加载和转换数据

时间:2014-10-01 18:23:05

标签: haskell

我非常喜欢哈斯克尔。我有一些数据需要处理,并认为我在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

原因是我需要在将数据存储在输出文件(即多个输入文件,一个输出文件)之前转置数据。

我怎样才能做到这一点?我有一个想法是,对于每个文件,我可以将列表写入输出文件,每行一个元素,然后在读取输入文件时更新输出文件中的每一行。但是,我现在都是耳朵。

2 个答案:

答案 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)