filipe3x 0 Posted December 26, 2010 Report Share Posted December 26, 2010 Saudações. Uma dúvida. Sempre que faço writeFile ou readFile de algo com acentos, aquilo escaxa tudo. Alguém sabe como resolver este problema? Investiguei um pouco e descobri que se tem que adicionar isto no cabeçalho: import System.IO.UTF8 import Prelude hiding (readFile, writeFile) import System.Environment (getArgs) No entanto, sucede que o ghci me adverte que o "System.IO.UTF8" não existe. Como procedo de modo a mitigar este problema? Desde já obrigado e um resto de boa noite. Link to post Share on other sites
filipe3x 0 Posted December 26, 2010 Author Report Share Posted December 26, 2010 Problema resolvido. Obrigado a todos. Link to post Share on other sites
filipe3x 0 Posted December 27, 2010 Author Report Share Posted December 27, 2010 Outra dúvida. getLines :: FilePath -> IO [string] getLines = liftM lines . readFile main = writeFile "nomeficheiro.txt" (getLines "alunos.txt") No código acima transcrito, como procedo de modo a que o segundo argumento da função writeFile seja do tipo [string] e não do tipo IO [string]? Obrigado. Link to post Share on other sites
Baderous 31 Posted December 27, 2010 Report Share Posted December 27, 2010 Tens de ir buscar o conteúdo do Monad IO devolvido pela função getLines. Depois tens de passar cada String dessa lista à função appendFile (para ir escrevendo sempre no fim do ficheiro, senão vais fazer overwrite ao que já lá existe). main :: IO () main = do { x <- getLines "alunos.txt"; writeLines "nomeFicheiro.txt" x } writeLines :: FilePath -> [string] -> IO () writeLines _ [] = return () writeLines f (h:t) = do { appendFile f h; writeLines f t } Link to post Share on other sites
filipe3x 0 Posted December 27, 2010 Author Report Share Posted December 27, 2010 Bem, parece que ainda não percebi bem como isto funciona. Eu tenho o seguinte código: import Control.Monad load :: FilePath -> IO [string] load = liftM lines . readFile main = do nomeficheiro<-getLine load nomeficheiro Ele funciona, mas se eu adicionar a função map parte (que parte em listas cada string da lista pela vírgula) à função load, ela deixa de funcionar. Dá aquele típico erro de conflito de tipos. Eu queria colocar assim: load = map parte . liftM lines . readFile ------- EDIT: Será devido ao facto da função readFile carregar o ficheiro de um modo lazy? (O map quando lá vai, só tem acesso ao primeiro carácter.) Link to post Share on other sites
Baderous 31 Posted December 27, 2010 Report Share Posted December 27, 2010 Porque o resultado de liftM é um Monad e não uma lista. O map aplica-se a uma lista. Link to post Share on other sites
filipe3x 0 Posted December 27, 2010 Author Report Share Posted December 27, 2010 Ok. E como resolvo isto? Não existe um equivalente ao map que funcione nesse caso? Link to post Share on other sites
Baderous 31 Posted December 28, 2010 Report Share Posted December 28, 2010 Tens de extrair o conteúdo do Monad IO, já dei um exemplo em cima de como isso se faz. Link to post Share on other sites
filipe3x 0 Posted December 28, 2010 Author Report Share Posted December 28, 2010 Pois... é isso. Pensei haver uma forma mais elegante de o fazer, pois esse método obriga a escrever num ficheiro e eu pretendia que a string toda ela fosse atribuída a uma variável. Link to post Share on other sites
filipe3x 0 Posted December 28, 2010 Author Report Share Posted December 28, 2010 Tenho a seguinte string: "["asdsad","asdasd","asdasd"]" Quero passar isso para uma lista de Strings, ou seja, ["asdsd","asdasd","asdsad"] através do read. Como faço isso? Link to post Share on other sites
Baderous 31 Posted December 28, 2010 Report Share Posted December 28, 2010 Essa string inicial não é uma string, são 4. 1) "[" 2) "," 3) "," 4) "]" Com lixo no meio (asdads). Link to post Share on other sites
filipe3x 0 Posted December 28, 2010 Author Report Share Posted December 28, 2010 Eish. 😲 Já vi que está aí um bico-de-obra. Alguma ideia como fazer isso? Edit: Enganei-me. Afinal as strings estão assim: "['asdsad','asdasd','asdasd']" E pretendo apenas e somente remover-lhes as aspas que a circundam. Link to post Share on other sites
HominusNocturna 0 Posted December 29, 2010 Report Share Posted December 29, 2010 Eish. 😲 Já vi que está aí um bico-de-obra. Alguma ideia como fazer isso? Edit: Enganei-me. Afinal as strings estão assim: "['asdsad','asdasd','asdasd']" E pretendo apenas e somente remover-lhes as aspas que a circundam. Mas se lhes removeres as aspas irá ficar ['asdsad','asdasd','asdasd'] que dará erro pois segundo o haskell as plicas denotam Char. Char = 'a', 'b', etc... String = "asd", "a", etc... Mas tenho quase a certeza que tu é que te enganaste a copiar o output para aqui. Link to post Share on other sites
filipe3x 0 Posted December 29, 2010 Author Report Share Posted December 29, 2010 Passa disto: "['asdsad','asdasd','asdasd']" Para isto: ["'asdsad'","'asdasd'","'asdasd'"] Como fazer isso? Link to post Share on other sites
HominusNocturna 0 Posted December 29, 2010 Report Share Posted December 29, 2010 Afinal não te enganaste Eu se pudesse até te ajudava mas tenho o meu projecto a 0 porque também não consigo estruturar o texto de forma que seja perceptível ao Haskell. E depois também estou com o horrível problema dos "\227" e mesmo alterando a codificação do txt continuo com o mesmo problema. E no ghc passa-se o seguinte: Input: "Não és da Sé" Output: "N\227o \233s da S\233" Logo não é do encoding do ficheiro. Também ja andei a importar os packages utf8-string e utf8-light a ver se resolvia e nada. Link to post Share on other sites
filipe3x 0 Posted December 29, 2010 Author Report Share Posted December 29, 2010 Aqui passava-se o mesmo. Tinha o encoding do .csv em ansi. Foi só mudar, et voila. Link to post Share on other sites
HominusNocturna 0 Posted December 29, 2010 Report Share Posted December 29, 2010 Aqui passava-se o mesmo. Tinha o encoding do .csv em ansi. Foi só mudar, et voila. Diz-me que GHCi e que SO é que estás a utilizar, sff. Link to post Share on other sites
filipe3x 0 Posted December 29, 2010 Author Report Share Posted December 29, 2010 Tou neste momento com o ghci 6.10.4 e Vista onde os acentos não funcionam. Mas se compilar no linux já dá tudo correctamente. Link to post Share on other sites
HominusNocturna 0 Posted December 29, 2010 Report Share Posted December 29, 2010 Ok, thanks. Maldito Windows Link to post Share on other sites
fett2k 0 Posted January 4, 2011 Report Share Posted January 4, 2011 estou no ubuntu e o problema ainda me acontece. estou completamente perdido nisto quando faço System.IO.UTF8.putStrLn "\224" dá lixo, quando uso a do Prelude dá certo. o mesmo para por exemplo \xba (o caractere º). e alguma sugestão para ao receber \xba de um ficheiro (lido como "\\xba" - ou \227 para "\\227") converter para o dito caractere? Link to post Share on other sites
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now