2014-10-01 1 views
1

나는 꽤 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 

같은 수 있습니다.

어떻게하면됩니까? 한 가지 생각은 각 파일에 대해 행 당 하나의 요소로 출력 파일에 목록을 쓰고 입력 파일을 읽으면 출력 파일의 각 행을 업데이트 할 수 있다는 것입니다. 그러나, 나는이 시점에서 모든 귀입니다.

답변

3

에 해당합니다. 모든 파일을 읽고 내용이 인 transposes으로 매핑됩니다.

import Data.List 

main = do 
    allFiles <- getDirectoryContents inputDir 
    contents <- mapM readFile $ validFiles allFiles 
    print $ transpose $ map getMonthRow contents 
+0

마지막 행은 'print $ transpose $ map getMonthRow contents'이어야하지만 그 외는 훌륭하게 작동했습니다. – Gevious

+1

* 모든 파일을 읽지 않습니다. 'readFile'은 게으른 입력입니다. 'getMonthRow'도 충분히 게으른 경우, 열린 파일 기술자를 다 사용하지 않는 한 출력을 쓰는 동안 모든 파일을 동시에 스트리밍 할 수 있어야합니다. 아마 당신이 원하는 것입니다. –

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) 
관련 문제