我是初学者,我试图读取文件夹文件calles“papers”(你可以在附件中看到我项目的树)。我正在使用此代码执行此操作:
module LeerDocumentos2 where
import System.Directory
import System.IO.Unsafe
import System.IO()
import Documento
reader :: IO [Documento]
reader = do
setCurrentDirectory "papers"
directorio <- getCurrentDirectory
putStrLn directorio -- Directorio donde estan los documentos
pathFicheros <- getDirectoryContents directorio
printAll pathFicheros
return (leerDocumentos pathFicheros)
printAll xs = if null xs -- If the list is empty
then return () -- then we're done, so we quit.
else do print (head xs) -- Otherwise, print the first element
printAll (tail xs) -- then print all the other elements.
leerDocumentos :: [FilePath] -> [Documento]
leerDocumentos [] = []
leerDocumentos (x:xs) = do
let documento = unsafePerformIO (leerDocumento x)
[documento]++ leerDocumentos xs
leerDocumento :: String -> IO Documento
leerDocumento ruta = do
putStrLn ruta
texto <- readFile ruta
let docuAux = lines texto
let revista = obtenerRevista docuAux
let idd = obtenerID docuAux
let anno = obtenerAnno docuAux
let titulo = obtenerTitulo docuAux
let resumen = obtenerResumen docuAux
let secciones = obtenerSecciones docuAux
let documento = D (revista,idd,anno,titulo,resumen,secciones)
return documento
obtenerRevista :: [String] -> String
obtenerRevista [] = []
obtenerRevista texto = head texto
obtenerID:: [String] -> String
obtenerID [] = []
obtenerID texto = head (drop 1 (texto))
obtenerAnno:: [String] -> String
obtenerAnno [] = []
obtenerAnno texto = head (drop 2 (texto))
obtenerTitulo:: [String] -> String
obtenerTitulo [] = []
obtenerTitulo texto = head (drop 4 (texto))
obtenerResumen:: [String] -> String
obtenerResumen [] = []
obtenerResumen texto = head (drop 6 (texto))
obtenerSecciones :: [String]->[String]
obtenerSecciones [] = []
obtenerSecciones texto = quitarSeparador (drop 8 (texto))
quitarSeparador :: [String] -> [String]
quitarSeparador [] = []
quitarSeparador (s:sn) = if s == "--" || length s <= 1 then --Para quitar lineas blancas
quitarSeparador sn
else
s:quitarSeparador sn
但我有下一个错误:
***例外:。:openFile:不合适的类型(是目录)
有人可以帮我吗?
答案 0 :(得分:2)
同样,请勿使用unsafePerformIO
。
我打赌你的问题是getDirectoryContents
会返回.
和..
这两个目录。
至少我会过滤掉那些。如果目录有任何子目录,您还需要将其过滤掉。
另外,我会熟悉Control.Monad。尝试这样的事情:
import Control.Monad (forM)
import Data.List (isPrefixOf)
reader = do setCurrentDirectory ...
paths <- getDirectoryContents dir
let files = filter (not . isPrefixOf ".") paths
forM files $ \file -> do
putStrLn $ "processing " ++ file
leerDocumento file
现在你可以摆脱unsafePerformIO
和leerDocumentos
。