Jump to content
filipe3x

Acentos, cedilhas

Recommended Posts

filipe3x

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.

Share this post


Link to post
Share on other sites
filipe3x

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.

Share this post


Link to post
Share on other sites
Baderous

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
                        }

Share this post


Link to post
Share on other sites
filipe3x

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.)

Share this post


Link to post
Share on other sites
Baderous

Porque o resultado de liftM é um Monad e não uma lista. O map aplica-se a uma lista.

Share this post


Link to post
Share on other sites
Baderous

Tens de extrair o conteúdo do Monad IO, já dei um exemplo em cima de como isso se faz.

Share this post


Link to post
Share on other sites
filipe3x

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.

Share this post


Link to post
Share on other sites
filipe3x

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?

Share this post


Link to post
Share on other sites
Baderous

Essa string inicial não é uma string, são 4.

1) "["

2) ","

3) ","

4) "]"

Com lixo no meio (asdads).

Share this post


Link to post
Share on other sites
filipe3x

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.

Share this post


Link to post
Share on other sites
HominusNocturna

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.  :D

Share this post


Link to post
Share on other sites
filipe3x

Passa disto: "['asdsad','asdasd','asdasd']"

Para isto: ["'asdsad'","'asdasd'","'asdasd'"]

Como fazer isso?

Share this post


Link to post
Share on other sites
HominusNocturna

Afinal não te enganaste  :D

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.

Share this post


Link to post
Share on other sites
HominusNocturna

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.

Share this post


Link to post
Share on other sites
filipe3x

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.

Share this post


Link to post
Share on other sites
fett2k

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?

Share this post


Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.