2017-10-17 4 views
0

J'essaie d'utiliser Haskell Turtle pour effectuer un traitement de fichier CSV, mais j'ai du mal à utiliser le Turtle.FilePath à partir de l'analyseur d'options. Voici un exampple:Utilisation de FilePath de Haskell Turtle avec 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 

J'ai un fichier salaries.csv dans le même répertoire. Si je cours ceci, je reviens à FilePath "salaries.csv": openBinaryFile: does not exist (No such file or directory). L'utilisation de tfpToPfp donne le même résultat. Si je commente le premier readFile et décommenter l'autre qui appelle BL.readFile sname alors cela fonctionne parfaitement. J'ai également essayé csvData <- BL.readFile $ fromString (tfpToStr fname), qui jette aussi une erreur.

Malheureusement, BL.readFile ne prend pas un Turtle.FilePath directement; il se plaint qu'il n'a pas obtenu un Prelude.FilePath. Alors comment est-il supposé obtenir un Turtle.FilePath en BL.readFile? J'utilise le résolveur de pile LTS-9.9 si cela fait une différence.

Répondre

1

La conversion peut également être effectuée sans utiliser directement system-filepath:

import qualified Data.Text as T 

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

J'ai effectivement trouvé quelque chose qui a fonctionné de this blog.

import Filesystem.Path.CurrentOS as Path 

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

Maintenant, je peux appeler

csvData <- BL.readFile $ filePathToString fname 

et il fonctionne. Si quelqu'un connaît une façon plus idomatique de le faire, s'il vous plaît commenter!