Tratando dados em java

Hoje vou falar sobre algo fundamental para qualquer linguagem de programação: Tratamento de dados.

Frequentemente lido com um problema que acredito ser comum em muitas empresas, e, digo empresas de grande porte: a base de dados, além de vir com um lay out não claro, vem com a base torta. Aí entra a questão de tratar a base, então entramos naquilo que já ouvimos desde o início de nossa base na área de T.I: Entrada, processamento e saída. Como manipular arquivos em Java? Neste casos usamos os conceitos de matrizes e vetores.

Este exemplo foi baseado em um lay out que estou desenvolvendo, ainda é simples mas além de funcionar mostra-nos uma idéia de como manipular dados, vamos começar chamando a classe de entrada e saída:

import java.io.*;/*classe para entrada e saída de dados*/

import java.util.*; /*comparar dados*/

class trat /*nome da classe*/

{

    public static void main(String[] args) /*aqui eu publico a classe onde será retornado um argumento void, ou seja, um argumento vazio

{

BufferedReader inReader = null; /*Instancia um objeto da classe BufferedReader que fornece a função readline e algumas outras, inReader retorna uma linha lida da entrada*/

PrintWriter outWriter = null;

String line;/*variável que será usada para receber as linhas que serão lidas do txt,e,ou as variável do txt, ou se preferir as colunas*/

A seguir, usando o try para tratamento de erros, iniciamos a descrição da ORIGEM ( de onde será buscado o arquivo, no caso um txt para ser lido e onde será especificado, através da cláusula catch o destino) no caso, aqui trabalhos com a leitura INREADER

try {

inReader = new BufferedReader(

new FileReader("c:\\CO252697.356"));/*arquivo de origem*/

} catch( FileNotFoundException e ) {

System.err.println("d:\\teste_co.txt");/*destino e muda o nome do arquivo*/

System.exit(1);

a seguir, usando o try para tratamento de erros, iniciamos a descrição do Destino( de onde será copiado o arquivo) no caso, aqui trabalhos com a saída OUTWRITER e além disso saíra com o nome de teste__co.txt*

try {

outWriter = new PrintWriter(

new FileWriter("d:\\teste_co.txt"));/*ORIGEM*/

} catch( FileNotFoundException e ) {

System.err.println("Não pode abrir d:\\teste_co.txt");/*DESTINO*/

System.exit(1);

} catch ( IOException e )/*Tratamento de erros*/

{

System.err.println(e.getMessage());

System.exit(1);

}

/*Aqui eu crio um loop while que enquanto a variavel line for diferente de null, ou seja, se na busca ele encontrar valores ele quebra o texto em pedaços*/

while((line = inReader.readLine())!= null) {

StringTokenizer st = new StringTokenizer(line);

/*quebra em pedaços*/

/*O pacote java.io tem as classes PrintStream e PrintWriter mas não tem as classes correspondentes para leitura de texto formatado. Para poder ler a representação textual de vários valores em uma linha temos que analisar o conteúdo dos dados utilizando a classe StreamTokenizer*/

/*aqui eu inicio o desenvolvimento do lay out do aquivo e com o uso do objeto

substring eu declaro o vetor, ou seja o inicio e o fim da leitura de cada variável que segue

abaixo, este passo ainda é para a leitura dos mesmos:*/

String DataMovto = /*st.nextToken*/(line.substring(0,8));

/*zero é o inicio do vetor e 8 é o fim*/

String Cpf = (line.substring(8,17));

String V3 = (line.substring(17,21));

String DgCpf = (line.substring(21,23));

String NumContr = (line.substring(23,38));

String NumParc = (line.substring(38,41));

String CodAgenc = (line.substring(41,45));

String Cod_Sist_Origem = (line.substring(45,47));

String Dt_Vencimento = (line.substring(47,55));

String Valor_Vencimento = (line.substring(55,70));

String Valor_Saldo_Parc_Max = (line.substring(70,85));

String Valor_Saldo_Parc_Min = (line.substring(85,100));

String Valor_Contr = (line.substring(100,115));

String Dt_Ult_Atual_Max =(line.substring(115,123));

String Dt_Ult_Atual_Min =(line.substring(123,131));

String Dt_Inicio_Contrato =(line.substring(131,139));

String Dt_Fim_Contr = (line.substring(139,147));

String Qtd_Dias_Vencido = (line.substring(147,152));

String Avalista = (line.substring(152,155));

String Cpf_Avalista = (line.substring(155,164));

String Fil_Avalista = (line.substring(164,168));

String Dg_Cpf_Avalista = (line.substring(168,170));

String Cod_Dest_Cred = (line.substring(170,172));

Agora eu inicio a saída dos dados já separados por ponto e virgula e com suas respectivas variáveis, desta forma é possível fazer qualquer tipo de comparação:

outWriter.println(DataMovto + ";" + Cpf + ";" + V3 + ";" + DgCpf+";" + NumContr + ";"

/* os vetores serão separados por ponto e virgula.*/

+ NumParc + ";" + CodAgenc + ";" + Cod_Sist_Origem + ";" + Dt_Vencimento + ";" + Valor_Vencimento + ";" + Valor_Saldo_Parc_Max + ";" + Valor_Saldo_Parc_Min + ";" + Dt_Ult_Atual_Max + ";" + Dt_Ult_Atual_Min + ";" + Dt_Inicio_Contrato + ";" + Dt_Fim_Contr + ";" + Qtd_Dias_Vencido + ";" + Avalista + ";" + Cpf_Avalista + ";" + Fil_Avalista + ";" + Dg_Cpf_Avalista + ";" + Cod_Dest_Cred+";");

}

/*finalizo o objeto para leitura e para saída*/

inReader.close();

outWriter.close();

} catch (IOException e) {

System.err.println(e.getMessage());

}

}

}

Segue o código completo:

import java.io.*;

import java.util.*;

class Mat4 {

public static void main(String[] args) {

BufferedReader inReader = null;

PrintWriter outWriter = null;

String line;

try {

inReader = new BufferedReader(

new FileReader("c:\\CO252697.356"));

} catch( FileNotFoundException e ) {

System.err.println("d:\\teste_co.txt");

System.exit(1);

}

try {

outWriter = new PrintWriter(

new FileWriter("d:\\teste_co.txt"));

} catch( FileNotFoundException e ) {

System.err.println("Não pode abrir d:\\teste_co.txt");

System.exit(1);

} catch ( IOException e ) {

System.err.println(e.getMessage());

System.exit(1);

}

try {

while((line = inReader.readLine())!= null) {

StringTokenizer st = new StringTokenizer(line);

String DataMovto = /*st.nextToken*/(line.substring(0,8));

String Cpf = (line.substring(8,17));

String V3 = (line.substring(17,21));

String DgCpf = (line.substring(21,23));

String NumContr = (line.substring(23,38));

String NumParc = (line.substring(38,41));

String CodAgenc = (line.substring(41,45));

String Cod_Sist_Origem = (line.substring(45,47));

String Dt_Vencimento = (line.substring(47,55));

String Valor_Vencimento = (line.substring(55,70));

String Valor_Saldo_Parc_Max = (line.substring(70,85));

String Valor_Saldo_Parc_Min = (line.substring(85,100));

String Valor_Contr = (line.substring(100,115));

String Dt_Ult_Atual_Max =(line.substring(115,123));

String Dt_Ult_Atual_Min =(line.substring(123,131));

String Dt_Inicio_Contrato =(line.substring(131,139));

String Dt_Fim_Contr = (line.substring(139,147));

String Qtd_Dias_Vencido = (line.substring(147,152));

String Avalista = (line.substring(152,155));

String Cpf_Avalista = (line.substring(155,164));

String Fil_Avalista = (line.substring(164,168));

String Dg_Cpf_Avalista = (line.substring(168,170));

String Cod_Dest_Cred = (line.substring(170,172));

outWriter.println(DataMovto + ";" + Cpf + ";" + V3 + ";"

+ DgCpf+";" + NumContr + ";" + NumParc + ";" + CodAgenc

+ ";" + Cod_Sist_Origem + ";" + Dt_Vencimento + ";" +

Valor_Vencimento + ";" + Valor_Saldo_Parc_Max

+";"+Valor_Saldo_Parc_Min+";" + Dt_Ult_Atual_Max+";"+

Dt_Ult_Atual_Min+";" + Dt_Inicio_Contrato +

";"+Dt_Fim_Contr + ";"+Qtd_Dias_Vencido+";" + Avalista +

";"+Cpf_Avalista+";"+Fil_Avalista+";" + Dg_Cpf_Avalista

+ ";"+ Cod_Dest_Cred+";");

}

inReader.close();

outWriter.close();

} catch (IOException e) {

System.err.println(e.getMessage());

}

}

}

esta é a base que fica no c: da minha máquina neste formato em txt(ORIGEM) e contém algo em torno de 500.000 linhas:

altradadjavafig01.jpg

Este é o resultado final já separado por ponto e vírgula, você pode testar fazendo comparações entre as variáveis e executando algumas operações dentro do código:

altradadjavafig02.jpg

Agora você pode tratar dados da maneira que você quiser decifrando-os e declarando os parâmetros dentro do compilador da forma que você precisar.