从CSV构造数据类型实例

时间:2011-05-24 00:43:50

标签: haskell csv algebraic-data-types

我有需要用来在Haskell中创建数据类型实例的CSV数据(继承 - 这里没有选择)。解析CSV没问题 - 教程和API比比皆是。

这是我的简化修剪测试案例的'show'生成的内容:

JField {fname = "cardNo", ftype = "str"} (string representation)

我能够读取将此字符串转换为JField数据记录。我的CSV数据只是字段的值,因此上面与JField对应的CSV行是:

cardNo, str

我正在以字符串列表[“cardNo”,“str”]

的形式阅读这些内容

所以 - 很容易暴力破解“字符串表示”的确切格式(但在Haskell中编写Java或python样式的字符串格式不是我的目标)。

我想做这样的事情(第一个List是静态的,第二个列表是读取文件CSV):

let stp1 = zip ["fname = ", "ftype ="] ["cardNo", "str"]

导致

[("fname = ","cardNo"),("ftype =","str")]

然后连接元组 - 要么显式地用++,要么用更聪明的方式来确定。

这是我在教程之外的第一段简单代码,所以我想知道这似乎是一种合理的Haskellian方式,或者显然有更好的方法来构建这篇文章:     fname =“cardNo”,ftype =“str”

不期待解决方案(这不是家庭作业,这是一项学习练习),而是批评或指导更好的方法来做到这一点。暴力行为很容易,但会破坏我的目标,即学习

2 个答案:

答案 0 :(得分:4)

我可能会离开,但map不会更好吗?我想我假设您将每行读入文件为[String],即

field11, field12
field21, field22

你可以写

map (\[x,y] -> JField {fname = x, ftype = y}) data

其中data是您的输入。我认为那样做会。

答案 1 :(得分:2)

如果您已经拥有fname字段的值(例如,在变量fn中)和ftype字段的值(在ft中),则只需执行JField {fname=fn, ftype=ft}。对于非String字段,只需在适当的位置插入read