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