为什么我为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
提前感谢您的帮助。
答案 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
。考虑readEither
或readMaybe
。