[Haskell-beginners] Reading Multiple Files and Iterate Function
Application
Daniel Fischer
daniel.is.fischer at web.de
Mon Oct 11 11:21:41 EDT 2010
On Monday 11 October 2010 16:56:58, Lorenzo Isella wrote:
> Dear All,
> Another I/O question.
> Let us say that you are given a list of files file1.dat,
> file2.dat...file10.dat and so on (i.e. every file is indexed by a number
> and every file is a single column where every entry is a string without
> spaces).
> In the snippet below I read file1.dat, convert it to a list and then
> print out its length.
> Now, how can I iterate the process on file1.dat, file2.dat and file3.dat
> and store the lengths in a list?
fileLength :: FilePath -> IO Int
fileLength file = fmap length (readFile file)
filename :: Int -> FilePath
filename i = "file" ++ show i ++ ".dat"
getAllLengths :: [Int] -> IO [Int]
getAllLengths nums = mapM (fileLength . filename) nums
If you want something other than the character count, instead of fileLength
use e.g.
countLines :: FilePath -> IO Int
countLines file = fmap (length . lines) (readFile file)
or whatever you're interested in.
Another nice thing is often forM (from Control.Monad)
forM nums $ \i -> do
let filename = "file" ++ show i ++ ".dat"
contents <- readFile filename
let result = function contents
doSomethingOrNot
return result
> I would like to map the file reading and following operations on the
> list [1,2.3], but that is giving me a headache.
> It is relatively easy to create the file name
>
> filename="file"++(show i)++".dat" , for i=1,2,3
>
> but it the the iteration part that is giving me troubles.
> Any suggestion is appreciated.
> Cheers
>
> Lorenzo
More information about the Beginners
mailing list