построение экземпляров типа данных из CSV - PullRequest
0 голосов
/ 24 мая 2011

У меня есть данные CSV (унаследованные - здесь нет выбора), которые мне нужно использовать для создания экземпляров типов данных в Haskell.С парсингом CSV проблем нет - обучающие программы и API имеются в большом количестве.

Вот что генерирует 'show' для моего упрощенного урезанного тестового примера:

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

Я могу прочитатьпреобразовать эту строку в запись данных JField.Мои данные CSV - это просто значения полей, поэтому строка CSV, соответствующая приведенному выше JField:

cardNo, str

, и я читаю их как список строк ["cardNo", "str"]

Итак, достаточно просто грубо форсировать точный формат «строкового представления» (но моя цель - писать строковое форматирование в Java или Python в Хаскеле).

Я думал о том, чтобы сделать что-то вроде этого (первый список является статическим, а второй список будет считан файлом CSV):

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

, что приведет к

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

и затем объединение кортежей - либо явно с помощью ++, либо каким-то более умным способом, который еще предстоит определить.

Это мой первый простой фрагмент кода вне учебных пособий, поэтому я хотел бы знать, если этокажется вполне приемлемым для Хаскеллианским способом сделать это, или какие явно лучшие способы можно построить именно таким образом: fname = "cardNo", ftype = "str" ​​

Не ожидая решения (это не домашняя работа, этоучебное упражнение), а скорее критика или рекомендации для лучшего способа сделать это.Перебрать это было бы легко, но победило бы мою цель - научиться

Ответы [ 2 ]

4 голосов
/ 24 мая 2011

Я мог бы быть далеко, но не будет ли map лучше здесь?Полагаю, я предполагаю, что вы читаете файл с каждой строкой как [String], т.е.

field11, field12
field21, field22

и т. Д.

Вы можете написать

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

где data ваш ввод.Я думаю, что это сделало бы.

2 голосов
/ 24 мая 2011

Если у вас уже есть значение поля fname (скажем, в переменной fn) и значение поля ftype (в ft), просто наберите JField {fname=fn, ftype=ft}.Для нестроковых полей просто вставьте read, где это необходимо.

...