Vetor de strings a partir de arquivo

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á :slight_smile:

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 :smiley:
Se tiver afim desta solução é só falar que estamos aqui para ajudar, apenas comece e vamos ajudando você no que precisar

Oi dyeimys,

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 :frowning:

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

Boa noite Manuela,

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]

Boa noite, JC!

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 = &quot;&quot;;                               //String temporaria para voce aramzenar a String
        for (int i = 0; i &lt; 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) + &quot;;&quot;;    //...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 &quot;2012.101.43.5462-7 ALINE FARIAS 158.787,21 M 582.010,00\n&quot;;
    }

    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!

Abaixo a comparação das duas condicionais.

ANTIGA

if (c == ' ') {
                temp += String.valueOf(c) + &quot;;&quot;;
            }

ATUAL

            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) + &quot;;&quot;;    
                }
            }
/**
 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!

Abrass :stuck_out_tongue:

Boa noite, dyeimys!

Perfeita essa sua idéia de próximo e anterior!

Desculpa por estar dando trabalho, mas… transformar em string?

A leitura do arquivo pode ficar como antes?

public static String leArquivo() {

	try {
		FileReader gravador = new FileReader("C:\\...\\...\\arquivo.txt");
		BufferedReader entrada = new BufferedReader(gravador);
                    String linha;

			while((linha= entrada.readLine())!=null) {
                                System.out.println(linha);
		         }

		}
			catch(Exception e) {
			System.out.println("");
		}
}

}

Desculpa mais uma vez! é que é tudo muito novo pra mim :?

Boa noite Manuela,
Ler arquivo pode ficar assim:

public static String leAqruivo() {
        try {
            FileReader gravador = new FileReader("C:\\...\\...\\arquivo.txt");
            BufferedReader entrada = new BufferedReader(gravador);
            String linha;
            String temp = "";

            while ((linha = entrada.readLine()) != null) {
                temp += (linha);
            }
            return temp;

        } catch (Exception e) {
            System.err.println("ERRO: " + e.getMessage());
            return null;
        }
    }

Ahh sim! Tinha colocado pra concatenar o temp com a linha mas não deu certo.

Não tenho nem palavras pra te agradecer, muito muito muito obrigada mesmo! :smiley:

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