[Haskell-beginners] Help with CSV

Hong Yang hyangfji at gmail.com
Mon Sep 7 22:35:29 EDT 2009


Thanks for your reply. I have a working program now using Text.CSV module.

Do you see any that can be improved?

When I print, the screen reads "Just "abc"". How can I get rid of "Just" in
the most elegant way?

Thanks,

Hong

-- file: ch22/PodMain.hs
module Main where

import System.Environment (getArgs)
import Text.CSV
import qualified Data.Map as M

main = do
       [args] <- getArgs
       result <- parseCSVFromFile args
       case result of
            Left errmsg    -> putStrLn "Error when parsing!"
            Right contents -> map_header_records contents

map_header_records :: CSV -> IO ()
map_header_records [] = return ()
map_header_records (x:xs) = process x xs

process :: [String] -> CSV -> IO ()
process x [] = return ()
process x (y:ys) = do
    let tuple = zip x y
    let hash = M.fromList tuple
    putStrLn (show (M.lookup "name" hash))
    process x ys


On Wed, Sep 2, 2009 at 8:23 PM, Keith Sheppard <keithshep at gmail.com> wrote:

> Not quite code but...
>
> here is an example of parsing CSV
> http://book.realworldhaskell.org/read/using-parsec.html and here is a
> library that you can use which is similar
> http://hackage.haskell.org/package/csv
>
> These approaches give you a 2D String list that you can do whatever
> you want with.
>
> if you need to turn a string into a double and you know the string is
> well formed i think the syntax looks like
>
> > let doubleVal = read stringVal :: Double
>
> There are better ways to do this if you need to be able to handle
> formatting errors but I don't know them off the top of my head
>
> -Keith
>
> On Wed, Sep 2, 2009 at 6:40 PM, Hong Yang<hyangfji at gmail.com> wrote:
> > I need to process csv files that have the characteristics as follows:
> > 1)    each file has thousands of columns which have String, Int, and
> Double
> > types
> > 2)    the number of columns may change
> > 3)    for those columns whose name do not change, their location may
> change
> >
> > I want to process some columns in 3) using Haskell.
> >
> > In Perl, I can easily have the code like below:
> >
> > use Text::CSV;
> > my $csv = Text::CSV->new( { allow_whitespace => 1 } );
> > open my $temp, "<", "temp.csv" or die "Cannot open temp.csv! ($!)";
> > my @fields = @{ $csv->getline($temp) };
> > $csv->column_names(@fields);
> > while ( my $hr = $csv->getline_hr($temp) ) {
> >     my $sn = $hr->{"UNIT:unitSerialNumber"};
> >     # processing goes here ...
> > }
> > close $temp;
> >
> > Can someone please give me an equivalent code in Haskell? Then I can
> digest
> > and expand it.
> >
> > Thanks,
> >
> > Hong
> >
> > _______________________________________________
> > Beginners mailing list
> > Beginners at haskell.org
> > http://www.haskell.org/mailman/listinfo/beginners
> >
> >
>
>
>
> --
> keithsheppard.name
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org/pipermail/beginners/attachments/20090907/971883c0/attachment.html


More information about the Beginners mailing list