我在尝试着
- 加载 CSV 文件
- 从文件中读取 ID
- 为每个 Id 加载一个外部 xml 文件
- 从 XML 中读取一些名称
- 将 ID 和名称写入新的 CSV 文件
我是 Haskell 的新手,真的很想学习它,我还处于理解的复制和粘贴阶段。我自己找到了每个部分的教程,但我很难将它们结合起来。
CSV 很简单,例如:
736572,"Mount Athos"
6697806,"North Aegean"
我使用Cassava读取 CSV 并使用HandsomeSoup读取 XML。
在这里,我尝试读取 id,加载 xml 并至少从 xml 打印名称。
{-# LANGUAGE ScopedTypeVariables #-}
import qualified Data.ByteString.Lazy as BL
import Data.Csv
import qualified Data.Vector as V
import Text.XML.HXT.Core
import Text.HandsomeSoup
import Data.List
import Data.Char
getPlaceNames::String->String->String
getPlaceNames pid name = do
let doc = fromUrl ("http://api.geonames.org/get?geonameId="++pid++"&username=demo")
c<-runX $ doc >>> css "alternateNames" >>> deep getText
return (head c)
main :: IO ()
main = do
csvData <- BL.readFile "input.csv"
case decode NoHeader csvData of
Left err -> putStrLn err
Right v -> V.forM_ v $ \ ( pid, name ) ->
putStrLn $ getPlaceNames pid name
我认为当我调用 getPlaceNames 并返回名称时我做错了。我什至不确定是否应该在 getPlaceNames 中使用“do”语句。
错误说
Couldn't match expected type ‘[[Char]]’
with actual type ‘IO [String]’
In a stmt of a 'do' block:
c <- runX $ doc >>> css "alternateNames" >>> deep getText
In the expression:
do { let doc
= fromUrl
("http://api.geonames.org/get?geonameId="
++ pid ++ "&username=demo");
c <- runX $ doc >>> css "alternateNames" >>> deep getText;
return (head c) }
In an equation for ‘getPlaceNames’:
getPlaceNames pid name
= do { let doc = ...;
c <- runX $ doc >>> css "alternateNames" >>> deep getText;
return (head c) }
但这可能只是我做错的一件事,因为我对单子和绑定缺乏了解。
任何帮助表示赞赏,即使它只是指向正确文档的指针。
干杯
比约恩