Olá pessoal tenho uma rotina de importação de arquivos, ele ta importando um arquivo do tipo csv do seguinte formato:
OS;7448201010;2010-06-15;2010-07-15;58;0.0;Serviços referentes ao Pacote 1 dos Cadastros de Clientes;
OS;7448201011;2010-06-14;2010-07-14;70;0.0;Serviços referentes ao Pacote 2 dos Cadastros de Clientes;
OS;7448201012;2010-06-13;2010-07-13;60;0.0;Serviços referentes ao Pacote 3 Cadastros de Fornecedores;
OS;7448201013;2010-06-12;2010-07-12;61;0.0;Serviços referentes ao Pacote 4 dos Cadastros de Clientes;
As partes de criação, manipulação dos tokens e manipulação com o DAO estão corretas, o problema está em inserir no banco. Os valores são inseridos fora do formado “UTF8” .
Abaico o erro no tomcat:
dados[0] : OS
dados[1] : 7448201011
dados[2] : 2010-06-14
dados[3] : 2010-07-14
dados[4] : 70
dados[5] : 0.0
dados[6] : Servi�os referentes ao Pacote 2 dos Cadastros de Clientes
14:44:43,180 ERROR [Sicff ] Erro ao inserir OS: org.postgresql.util.PSQLException: ERROR: character 0xefbfbd of encoding "UTF8" has no equivalent in "LATIN1"
Alguma ideia de como resolver?
Abraços
EFBFBD é o “BOM” (Byte Order Mark), em Unicode o código é \uFFFD.
Como isso não é relevante para seus dados (é um lixo que serve para distinguir, em um arquivo-texto, qual é a codificação usada - se é UTF-8, UTF-16 etc.), você pode tentar um “replace” que remova o caracter Unicode “\uFFFD” das suas strings antes de inserir no banco.
[quote=entanglement]EFBFBD é o “BOM” (Byte Order Mark), em Unicode o código é \uFFFD.
Como isso não é relevante para seus dados (é um lixo que serve para distinguir, em um arquivo-texto, qual é a codificação usada - se é UTF-8, UTF-16 etc.), você pode tentar um “replace” que remova o caracter Unicode “\uFFFD” das suas strings antes de inserir no banco. [/quote]
Mas onde devo colocar esse “replace” ou “\uFFFD”, no caso se retirar o caracter ele não vai inserir servios?
Abaixo coloco o Listener responsável por manipular arquivo para Upload.
[code]public void listener(UploadEvent event) throws Exception {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
UploadItem arquivo = event.getUploadItem();
limparDados();
try {
BufferedReader reader = new BufferedReader(new FileReader(arquivo.getFile()));
String dados[] = new String[7];
String linha = reader.readLine();
while (!linha.equalsIgnoreCase("")) {
StringTokenizer st = new StringTokenizer(linha, ";");
dados[0] = st.nextToken();
dados[1] = st.nextToken();
dados[2] = st.nextToken();
dados[3] = st.nextToken();
dados[4] = st.nextToken();
dados[5] = st.nextToken();
dados[6] = st.nextToken();
String numeroOS = dados[1];
Date dataAbertura = (Date) df.parse(dados[2]);
Date dataEntrega = (Date) df.parse(dados[3]);
float tamanhoPF = Float.parseFloat(dados[4]);
float percentualErros = Float.parseFloat(dados[5]);
String obs = dados[6];
//Cria um Objeto OS
Os os = new Os();
os.setNumero_os(numeroOS);
os.setNum_asc(getAscSelecionada());
os.setData_abertura_os(dataAbertura);
os.setTamanho_pf_os(tamanhoPF);
os.setPerc_erros_os(percentualErros);
os.setObs_os(obs);
os.setStatus_os(0); //sempre será 0 - Aberto
os.setDataEntrega_os(dataEntrega);
//Inseri no Banco
inserir(os);
linha = reader.readLine();
}
reader.close();
} catch (Exception excecao) {
logger.error("Erro ao tentar efetuar o Upload do Arquivo: " + arquivo.getFile(), excecao);
}
}[/code]
Abraços
Boa pergunta. Veja qual dessas strings contém esse maldito caracter, remova-o e isso provavelmente não irá dar problemas.
A string é a String obs = dados[6], mas não intendi, como assim remover?? mas dai o nome vai ser gravado no banco errado sem os acentos … ou sem nada na string?? é isso?
Não; esse caracter não é um acento. É um BOM - procure por “Byte Order Marker” na Internet, por favor. Ele não serve para nada (e não deve ser inserido em um banco de dados); a única serventia desse caracter é aparecer na primeira posição de um arquivo-texto, para indicar á aplicação que está lendo esse arquivo-texto qual é a codificação.
Você pode, sem medo, fazer isto aqui:
String obs = dados[6].replaceAll ("\uFFFD", "");
[quote=entanglement]Não; esse caracter não é um acento. É um BOM - procure por “Byte Order Marker” na Internet, por favor. Ele não serve para nada (e não deve ser inserido em um banco de dados); a única serventia desse caracter é aparecer na primeira posição de um arquivo-texto, para indicar á aplicação que está lendo esse arquivo-texto qual é a codificação.
Você pode, sem medo, fazer isto aqui:
String obs = dados[6].replaceAll ("\uFFFD", "");
[/quote]
Deu certo entanglement, porém como imaginava, o replace “come” os caracteres com acento e insere errado no banco…
Existe alguma forma de resolver isso?
Não existe uma forma de inserir sem usar métodos de replace? ou seja com alguma mudança de alguma configuração de enconding etc.
Isso não pode ocorrer. O que está ocorrendo, provavelmente, é que você está usando a forma errada de ler o arquivo-texto.
Troque:
BufferedReader reader = new BufferedReader(new FileReader(arquivo.getFile()));
por
String encoding = "UTF-8"; // não sei se é isso - você pode tentar outros encodings, como "Windows-1252" ou "ISO-8859-1", até achar o correto
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream (arquivo.getFile()), encoding));
[quote=entanglement][quote=satangoss]
Deu certo entanglement, porém como imaginava, o replace “come” os caracteres com acento e insere errado no banco…
[/quote]
Isso não pode ocorrer. O que está ocorrendo, provavelmente, é que você está usando a forma errada de ler o arquivo-texto.
Troque:
BufferedReader reader = new BufferedReader(new FileReader(arquivo.getFile()));
por
String encoding = "UTF-8"; // não sei se é isso - você pode tentar outros encodings, como "Windows-1252" ou "ISO-8859-1", até achar o correto
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream (arquivo.getFile()), encoding));
[/quote]
vlw cara RESOLVIDO era mesmo isso só mudei a string encoding pra “ISO-8859-1” e ele pegou certinho vlw broder :).