Oii galera, estou desenvolvendo um código Java para ler arquivo txt e transformar em csv e não sei mais o que fazer, preciso entregá-lo amanhã. Gostaria da ajuda de vocês!
O código lê cada linha do arquivo. Exemplo das linhas:
código nome 01/01/2011 tipo 01/01/2012 tipo
2012.101.43.5462-7 ALINE FARIAS 158.787,21 M 582.010,00 M
2012.101.54.3465-3 BARBARA FERNANDES 345.123,72 M 459.091,89 M
2012.101.65.1781-5 CARLA DIAS 0,00 0,00
e por ai vai…
Como deu pra perceber apenas a parte do código possui o mesmo número de caracteres e algumas linhas possuem 6 tipos de informaçoes e outras apenas 4.
Minha idéia era armazenar as linhas em um vetor e um for para soltar um “;” a cada vez que ele encontrar um espaço em branco.
Para que fique assim:
código nome 01/01/2011 tipo 01/01/2012 tipo
2012.101.43.5462-7;ALINE FARIAS;158.787,21;M;582.010,00;M;
2012.101.54.3465-3;BARBARA FERNANDES;345.123,72;M;459.091,89;M;
2012.101.65.1781-5;CARLA DIAS;0,00;;0,00;;
Alguem aí tem alguma idéia de como posso implementar isso?
Idéias de como fazer em outras formas, também agradeço!
Obrigada desde já
Eu achei que ja tinha postado uma resposta aqui, mas não sei se foi moderado ou eu esqueci de enviar (Sei que sumiu).
Eu tinha colocado o seguinte codigo:
public class EstudoGuj {
public static String getCvs(String a) {
String temp = ""; //String temporaria para voce aramzenar a String
for (int i = 0; i < a.length(); i++) { //Percorrendo toda a String
char c = a.charAt(i); //Pegando o caracter
if (c == ' ') { //Verificando se ele e um espaço ...
temp += String.valueOf(c) + ";"; //...Se sim ele pega o caracter coloca na temp e add um ';'
} else { //... Se nao
temp += String.valueOf(c); //...Apenas coloca o proprio caracter
}
}
return temp;
}
public static String leAqruivo(){
/**
* Aqui voce implenta a leitura do aquivo e retorna uma string dele
*/
return "código nome 01/01/2011 tipo 01/01/2012 tipo \n2012.101.43.5462-7 ALINE FARIAS 158.787,21 M 582.010,00\n";
}
public static void main(String aa[]) {
String texto = leAqruivo();
System.out.println(getCvs(texto));
//Voce pode verificar que o nome Aline Farias está com ';'. Agora é voce tratar isto
}
}
Porém após estudar mais um pouco aqui apareceu uma ideia para você, porém não é tão Trivial.
Você pode trabalhar com reconhecimento de padrão, ai você me pergunta como? e eu te respondo.
código nome 01/01/2011 tipo 01/01/2012 tipo
2012.101.43.5462-7 ALINE FARIAS 158.787,21 M 582.010,00 M
2012.101.54.3465-3 BARBARA FERNANDES 345.123,72 M 459.091,89 M
2012.101.65.1781-5 CARLA DIAS 0,00 ,00
Como verificamos em cima os codigos tem um padrao onde é 4 grupo de números e um digito (Porem tudo numero).
Os campos de nome são letras, depois tem outro campo numerico depois o tipo que aparenta se uma letra. No caso a ideia que tenho é esta, é ir lendo o aquivo e achando os padrões e acrescentando os ‘;’
Se tiver gostado desta solução e quiser o algoritmo é só pagar 100 Reais está na sua mão
Brincadeirinha Se tiver afim desta solução é só falar que estamos aqui para ajudar, apenas comece e vamos ajudando você no que precisar
Fiz uma coisa parecida. Tentei usar o replace para substituir os espaços por ; mas não deu muito certo porque os ; também foram incluídos entre nomes e sobrenomes
Gostaria sim de sua solução, qualquer idéia é de grande ajuda!
Por enquanto, o código apenas lê o arquivo linha por linha (são mais de 2 mil linhas e a parte do código nome 01/01/2011 tipo 01/01/2012 tipo não precisa nem ser lida, coloquei apenas para entendimento, só quero mesmo manipular o conteúdo.
Obs.: O código precisa ser entregue segunda, não amanhã. rs
O Java possui um método chamado split que na minha opinião te auxiliará bastante.
Com ele você poderá passar todo o conteúdo de uma linha de seu arquivo fonte para um vetor e depois gravar cada posição do mesmo em um outro arquivo seguido de um “;”.
Abaixo uma idéia do código:
[code]
public void marcaEspacoEmBranco(String arquivoEntrada, String arquivoSaida)
{
try
{
BufferedReader leitor = new BufferedReader(new FileReader(arquivoEntrada));
BufferedWriter escritor = new BufferedWriter(new FileWriter(arquivoSaida));
String []linha;
int i;
while(leitor.ready())
{
linha = leitor.readLine().split(" "); //Passa para o vetor uma linha do arquivo
for(i = 0; i < linha.length; i++)
{
escritor.write(""+linha[i]+";"); //Faz a gravação no arquivo destino.
escritor.flush();
}//fim for
escritor.newLine();
}//fim while
}
catch(Exception erro)
{
System.out.print(erro.getMessage());
}
}//fim marcaEspacoEmBranco()[/code]
Minha primeira tentativa foi com o split, porém ocorre o mesmo problema da inserção do ; entre nome e sobrenome. Por isso gostaria de algo que resolvesse esse problema e o do valor 0,00. Não sei se perceberam mas quando possui 0,00 não possui a letra e nesse caso ; deve ser incluído 2 vezes na ocorrência.
Obrigada pela ajuda.
Bom dia Manuela Campos,
Após dar uma estudada aqui em seu problema e como já havia dito existe um padrão nesta String e outra como você disse que o cabeçalho não importa para você eu consegui resolver isto.
Segue abaixo o Código e após ele eu explico melhor o que acontece
public class EstudoGuj {
public static String getCvs(String a) {
String temp = ""; //String temporaria para voce aramzenar a String
for (int i = 0; i < a.length(); i++) { //Percorrendo toda a String
char c = a.charAt(i); //Pegando o caracter
if (c == ' ') { //Verificando se ele e um espaço ...
char proximo = a.charAt(i + 1); //Pega o Proximo
char antes = a.charAt(i - 1); //Pega o Anterior
if (Character.isLetter(proximo) // Se o proximo e o anterior for Letra ele
&& Character.isLetter(antes)) { // acrecenta, pois aqui tem um padrao de como é
temp += String.valueOf(c); //Seu texto
} else {
temp += String.valueOf(c) + ";"; //...Se é nao é letra ele pega o caracter coloca na temp e add um ';'
}
} else { //... Se nao
temp += String.valueOf(c); //...Apenas coloca o proprio caracter
}
}
return temp;
}
public static String leAqruivo() {
/**
* Aqui voce implenta a leitura do aquivo e retorna uma string dele
*/
return "2012.101.43.5462-7 ALINE FARIAS 158.787,21 M 582.010,00\n";
}
public static void main(String aa[]) {
String texto = leAqruivo();
System.out.println(getCvs(texto));
//Voce pode verificar que o nome Aline Farias agora não está com ';'.
}
}
Como você pode verificar a mudança aconteceu dentro da condição que tratava se ele fosse ’ ’ (espaço) ele acrescentava ‘;’.
Agora o que ele faz é: Se ele for um espaço ele vai verificar se o Anterior e o Próximo é uma Letra, se for ele não acrescenta
pois com o padrão que eu descobri sempre que acontece isto é porque este é um nome!
if (c == ' ') {
char proximo = a.charAt(i + 1);
char antes = a.charAt(i - 1);
if (Character.isLetter(proximo)
&& Character.isLetter(antes)) {
temp += String.valueOf(c);
} else {
temp += String.valueOf(c) + ";";
}
}
/**
Você pode verificar que além de ver se é espaço ele verifica o próximo e anterior
Assim ele reconhece o padrão
**/
Está ai um auxilio para você, agora é você tratar da Leitura do Arquivo e transformar ele em String e depois escrever em arquivo de novo!
Quando resolver o problema peço que coloque [Resolvido] no tópico e explique a solução do seu problema por completo aqui… Isto pode ajudar outras pessoas