2017-10-17 93 views
0

我想用Haskell Turtle做一些CSV文件處理,但是我在使用選項解析器中的Turtle.FilePath時遇到了問題。 下面是一個exampple:使用Haskell Turtle的FilePath和readFile

{-# LANGUAGE OverloadedStrings #-} 
module Main where 

import Lib 

import Control.Applicative 
import qualified Data.ByteString.Lazy as BL 
import Turtle 

data Args = Args Turtle.FilePath 
    deriving Show 

tfpToStr :: Turtle.FilePath -> String 
tfpToStr fpath = show fpath 

tfpToPfp :: Turtle.FilePath -> Prelude.FilePath 
tfpToPfp fpath = show fpath 

parser :: Parser Args 
parser = Args <$> (argPath "fname" "The file containing the data") 

sname :: String 
sname = "salaries.csv" 

main :: IO() 
main = do 
    Args fname <- options "Salary Printer" parser 
    csvData <- BL.readFile (tfpToStr fname) 
    -- csvData <- BL.readFile sname 
    putStrLn $ show csvData 

我在同一個目錄中的文件salaries.csv。如果我運行這個,我回來FilePath "salaries.csv": openBinaryFile: does not exist (No such file or directory)。使用tfpToPfp可以得到相同的結果。如果我將第一個readFile註釋掉,並取消註釋另一個稱爲BL.readFile sname的註釋,那麼它可以很好地工作。我也試過csvData <- BL.readFile $ fromString (tfpToStr fname),那也會引發錯誤。

不幸的是,BL.readFile不直接採取Turtle.FilePath;它抱怨說它沒有得到Prelude.FilePath

那麼人們應該如何獲得Turtle.FilePathBL.readFile

我使用堆棧解析器LTS-9.9,如果這有所作爲。

回答

1

的轉化也不直接使用system-filepath進行:

import qualified Data.Text as T 

filePathToString :: FilePath -> String 
filePathToString = T.unpack . format fp 
0

我碰巧找到從this blog起作用的東西。現在

import Filesystem.Path.CurrentOS as Path 

filePathToString :: FilePath -> String 
filePathToString = Path.encodeString 

我可以叫

csvData <- BL.readFile $ filePathToString fname 

和它的作品。如果有人知道更多的這種做法,請評論!