Haskell Text.CSV模块

时间:2018-03-21 12:10:16

标签: haskell

为什么我为parseCSV函数输入 Text.Parsec.Error.ParseError CSV ,尽管在​​文档中它说输出是 ParseError CSV ?我想将CSV文件导入Haskell,然后从中导出特定列,然后计算该列的统计信息。

我导入了一个CSV文件,如:

data = parseCSV "/home/user/Haskell/data/data.csv"

noEmpRows = either (const []) (filter (\row -> 2 <= length row))

readIndex :: Read cell => Either a CSV -> Int -> [cell]

readIndex csv index = map (read . (!!index)) (noEmpRows csv)

然后我想readIndex data 9 :: [Integer]时出错。

我还试过了一个函数parseCSVFromFile

https://hackage.haskell.org/package/csv-0.1.2/docs/Text-CSV.html#t:CSV

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您真正要问的问题是如何使用Text.CSV?

给定文件test.csv:

1,Banana,17
2,Apple,14
3,Pear,21

和GHCi中的这一行:

Prelude> Text.CSV.parseCSVFromFile "test.csv"
Right [["1","Banana","17"],["2","Apple","14"],["3","Pear","21"],[""]]

如果要提取列,请为其构建函数:

main :: IO ()
main = do
  test_csv <- parseCSVFromFile "test.csv"
  case test_csv of
    Right csv -> print (extractColumn csv 2 :: [Int])
    Left err -> print err

extractColumn :: Read t => CSV -> Int -> [t]
extractColumn csv n =
  [ read (record !! n) | record <- csv
                       , length record > n
                       , record /= [""] ]

这应该产生输出[17,14,21]

由于此处存在足够的失败空间(一行可能包含的字段少于n,或者某一行上的字段n中的字符串可能无法读取 t < / em>),您可能想要处理或报告是否发生错误。如果该字段包含太少的字段,则上面的代码会丢弃该行,如果该字段不是 Int ,则会抛出Prelude.read: no parse。考虑readEitherreadMaybe