Guga23
Outubro 29, 2012, 8:29am
#1
Galera estou postando aqui meu código. O mesmo se encontra com alguns erros. Primeiro ele não está lendo a tabela.txt inteira, como deveria. Não está lendo a primeira linha.
Segundo e mais importante:
Preciso tratar os valores de uma tabela.txt. De forma que se faltar alguma data ou hora, esta seja incrementada: Ex: Tabela tem “Data Hora Valor”
25/01/2012 09:00:00 0.000
25/01/2012 10:00:00 0.000
25/01/2012 11:00:00 0.000
25/01/2012 12:00:00 0.000
25/01/2012 14:00:00 0.000
25/01/2012 15:00:00 0.000
25/01/2012 16:00:00 0.000
25/01/2012 17:00:00 0.000
25/01/2012 18:00:00 0.000
Nota-se que não há “25/01/2012 13:00:00 0.000”
Gostaria de ajuda como faço para verificar isso de forma simples.
[code]Código
package testearq.org ;
import java.io.BufferedReader;
import java.io.FileReader;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.JFileChooser;
public class Leitura {
public static Date formataData(String data) throws Exception {
if (data == null || data.equals(""))
return null;
Date date = null;
try {
DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
date = (java.util.Date)formatter.parse(data);
} catch (ParseException e) {
throw e;
}
return date;
}
public static Date formataHora(String hora) throws Exception {
if (hora == null || hora.equals(""))
return null;
Date hour = null;
try {
DateFormat formatter = new SimpleDateFormat("HH:mm");
hour = (java.util.Date)formatter.parse(hora);
} catch (ParseException e) {
throw e;
}
return hour;
}
public static void main(String[] args) {
JFileChooser arquivo = new JFileChooser();
arquivo.showDialog(null, null);
String nome = arquivo.getSelectedFile().getAbsolutePath().toString();
try {
FileReader arq = new FileReader(nome);
BufferedReader lerArq = new BufferedReader(arq);
String datastr = null;
String refstr = null;
String horastr = null;
String linha = lerArq.readLine();
while (linha != null){
System.out.printf("%s %s %s\n", datastr, horastr, refstr);
linha = lerArq.readLine();
datastr = linha.substring(0,10);
formataData(datastr);
horastr = linha.substring(11,19);
formataHora(horastr);
refstr = linha.substring(20);
refstr = refstr.trim();
}
arq.close();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println();
}
}
[/code]
A primeira linha você está lendo na declaração da String linha. Declare diferente.
String linha = "";
while(...){
linha = lerArq.readLine();
}
// ou
while((linha = lerArq.readLine())!=null){
}
O outro passo é comparar a cada linha recebida se a hora e hora foi acrescentada corretamente.
Guga23
Outubro 29, 2012, 9:09am
#3
Valeu a ajuda. Está lendo um pouco mais o arquivo, porém ainda não lê inteiro!
Essa tabela.txt que preciso ler, te valores desde 2006.
E está imprimindo valores desde 26/08/2011.
Inicio da tabela:
01/01/2006 00:00:00 6.500
Todos os dias até 2012.
Inicio da Impressão:
26/08/2011 01:00:00 0.000
Até hoje.
Sabe se o eclipse tem limite de impressão ou é erro na leitura?!
Pode ser limite de impressão do console mesmo. É configurável, mas não sei de cabeça como faz isso. Qualquer coisa debuga para ver se está indo desde a primeira linha.
O console do Eclipse não simula perfeitamente um console como o do Windows ou do Unix.
O exemplo clássico é quando você quer usar “\r” para retornar ao início da mesma linha.
Execute um código como o seguinte, no Windows ou no Linux:
for (int i = 0; i < 1000; i++) {
System.out.print (i + "\r");
}
System.out.println();
No Windows e no Linux, aparece apenas uma linha com o valor 999 (ele vai escrevendo e sobrepondo)
No console do Eclipse (não importando se for no Windows ou no Linux) ele imprime todos os números de forma um pouco bagunçada (não sei se é um por linha ou imprime tudo na mesma linha).
Guga23
Outubro 30, 2012, 6:51am
#6
E alguma ideia de como fazer pra eu inserir valores ordenados na tabela.
Teria que criar um metodo ou tem como fazer dentro do proprio main?!
Você não precisa ter preguiça de criar métodos.
Eles ajudam a organizar suas idéias.
Você não paga nenhum centavo para criar um novo método.
Botar todo o código no “main” é sinal que seu código vai ficar bagunçado e você vai acabar se perdendo na hora de tentar corrigir o seu programa.
A gente costuma chamar código muito extenso (mais de 60 linhas por método) de “linguição” e código muito enrolado de “macarrão” - acho que essas coisas não são boas para o seu colesterol
De qualquer forma, por que é que você não combina a data e hora em uma única leitura? Do jeito que você fez (criando 2 objetos “Date” separados) é bem difícil saber se as datas e horas estão com diferença de um dia ou não.
Cuidado na virada do horário de verão
Guga23
Outubro 31, 2012, 8:31am
#8
Com relação a estrutura em si, eu já organizei em várias Classes ontem mesmo.
Com relação aos dois objetos. Implementei os dois, pois há tabelas que terão somente dias, em caso de análises por dia apenas.
Ex:
Tabela 1
Data Valor
25/10/12 2.5
26/10/12 3.5
Ou
Tabela 2
25/01/2012 09:00:00 0.000
25/01/2012 10:00:00 0.000
25/01/2012 11:00:00 0.000
25/01/2012 12:00:00 0.000
25/01/2012 14:00:00 0.000
Valeu pela dica.
Vo da uma estudada como implementar o metodo, pois a idéia eu tenho, o problema é coloca-la em pratica é bastante custoso ja que sou iniciante. Criar uma classe só pra manipulaçao chamando esses objetos. Usando Java.util.Date eu resolveria o problema das tabelas com data apenas.
Obrigado novamente!
Guga23
Novembro 9, 2012, 2:01pm
#9
Resolvido! Eu estava tentando deslocar o arraylist na mão, esse era o erro! Add(index,String) ja faz isso!!!
Ta ae codigo pronto!
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Scanner;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
public class Principal {
public static void main(String[] args) throws IOException, ParseException {
ArrayList<String> vetor = new ArrayList<String>();
Scanner ler = new Scanner(System.in);
int opcao;
Load(vetor);
do {
System.out.printf("\n**** Menu Principal *****\n");
System.out.printf("[ 1 ] Verifica Dia\n");
System.out.printf("[ 2 ] Verifica 1 hora\n");
System.out.printf("[ 3 ] Verifica 30 minutos\n");
System.out.printf("[ 4 ] Verifica 15 minutos\n");
System.out.printf("[ 5 ] Verifica 10 minutos\n");
System.out.printf("[ 0 ] Salvar e Fechar o Arquivo\n");
System.out.printf("\nOpção Desejada: ");
opcao = ler.nextInt();
switch (opcao) {
case 1:
verifica(vetor);
removeDupla(vetor);
verificaDia(vetor);
break;
case 2:
verificaDH(vetor);
removeDuplaDh(vetor);
verifica1hora(vetor);
break;
case 3:
verificaDH(vetor);
removeDuplaDh(vetor);
verifica30min(vetor);
break;
case 4:
verificaDH(vetor);
removeDuplaDh(vetor);
verifica15min(vetor);
break;
case 5:
verificaDH(vetor);
removeDuplaDh(vetor);
verifica10min(vetor);
break;
}
System.out.printf("\n\n");
} while (opcao != 0);
Gravar(vetor);
JOptionPane.showMessageDialog(null, "Arquivo Corrigido com Sucesso");
}
// Leitura do arquivo .txt para o vetor
public static void Load(ArrayList<String> vetor) {
JFileChooser arquivo = new JFileChooser();
arquivo.showDialog(null, null);
String nome = arquivo.getSelectedFile().getAbsolutePath().toString();
try {
FileReader arq = new FileReader(nome);
BufferedReader lerArq = new BufferedReader(arq);
String linha = lerArq.readLine();
while (linha != null) {
vetor.add(linha);
linha = lerArq.readLine();
}
lerArq.close();
arq.close();
} catch (Exception e) {
e.printStackTrace();
}
}
// Gravação no arquivo
public static void Gravar(ArrayList<String> vetor) throws IOException {
JFileChooser arquivo = new JFileChooser();
arquivo.showSaveDialog(null);
String nome = arquivo.getSelectedFile().getAbsolutePath().toString();
FileWriter arq = new FileWriter(nome + ".txt");
PrintWriter gravarArq = new PrintWriter(arq);
int i, n = vetor.size();
for (i = 0; i < n; i++) {
gravarArq.printf("%s%n", vetor.get(i));
}
gravarArq.close();
}
// Lista os elementos com suas posições no vetor
public static void listar(ArrayList<String> vetor) {
System.out.printf("\nListadando as referencias do Vetor:\n");
int i, n = vetor.size();
for (i = 0; i < n; i++) {
System.out.printf("Posição %d- %s\n", i, vetor.get(i));
}
System.out.printf("---------------------------------------");
}
private static Date strToDate(String data) {
Date d = new Date();
SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");
try {
d = df.parse(data);
} catch (ParseException ex) {
ex.printStackTrace();
}
System.out.println(df.format(d));
return d;
}
private static Date strToDateH(String dataH) {
Date dh = new Date();
SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
try {
dh = df.parse(dataH);
} catch (ParseException ex) {
ex.printStackTrace();
}
System.out.println(df.format(dh));
return dh;
}
private static String converteData(java.util.Date dtData) {
String result;
SimpleDateFormat out;
out = new SimpleDateFormat("dd/MM/yyyy");
result = out.format(dtData);
System.out.println(result);
return result;
}
private static String converteDataH(java.util.Date dth) {
String result;
SimpleDateFormat out;
out = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
result = out.format(dth);
System.out.println(result);
return result;
}
public static void verifica(ArrayList<String> vetor) {
int index = 0;
String dados;
String data[];
while (index < vetor.size()) {
data = vetor.get(index).split(" |\t");
dados = data[0];
if (isDateValid(dados) == false) {
System.out.println("Item excluido: " + vetor.get(index));
vetor.remove(index);
} else {
index++;
}
}
}
// Verifica se data é valida
private static boolean isDateValid(String date) {
SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");
df.setLenient(false);
try {
df.parse(date);
return true;
} catch (ParseException e) {
return false;
}
}
// Remove datas falsas
public static void verificaDH(ArrayList<String> vetor) {
int index = 0;
String dados;
String data[];
while (index < vetor.size()) {
data = vetor.get(index).split(" |\t");
dados = data[0] + " " + data[1];
if (isDateValidDH(dados) == false) {
System.out.println("Item excluido: " + vetor.get(index));
vetor.remove(index);
} else {
index++;
}
}
}
// Verifica se hora é valida
private static boolean isDateValidDH(String dataDh) {
SimpleDateFormat dhf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
dhf.setLenient(false);
try {
dhf.parse(dataDh);
return true;
} catch (ParseException e) {
return false;
}
}
// Gera Relatorio
public static void GerarRel(ArrayList<String> vetor) throws IOException {
JFileChooser arquivo = new JFileChooser();
arquivo.showDialog(null, "Gerar Relatório");
String nome = arquivo.getSelectedFile().getAbsolutePath().toString();
FileWriter arq = new FileWriter(nome + "-relatorio.txt");
PrintWriter gravarArq = new PrintWriter(arq);
int i, n = vetor.size();
for (i = 0; i < n; i++) {
gravarArq.printf("Duplicados Excluidos: %s%n", vetor.get(i));
}
gravarArq.close();
}
public static void removeDupla(ArrayList<String> vetor)
throws ParseException, IOException {
ArrayList<String> vetorRelatorio = new ArrayList<String>();
int erros = 0;
int index = 0;
String dados;
String data[];
Timestamp dataAtual = null;
Timestamp dataAnt = null;
while (index < vetor.size()) {
data = vetor.get(index).split(" |\t");
dados = data[0];
dataAtual = new Timestamp(strToDate(dados).getTime());
if ((dataAnt != null) && (dataAtual.getTime() == dataAnt.getTime())) {
vetorRelatorio.add(vetor.get(index));
erros++;
vetor.remove(index);
} else {
dataAnt = dataAtual;
index++;
}
}
if (erros != 0)
GerarRel(vetorRelatorio);
JOptionPane.showMessageDialog(null, "Relatório Gerado com sucesso: "
+ erros);
}
public static void removeDuplaDh(ArrayList<String> vetor)
throws ParseException, IOException {
ArrayList<String> vetorRelatorioDh = new ArrayList<String>();
int erros = 0;
int index = 0;
String dados;
String data[];
Timestamp dataAtual = null;
Timestamp dataAnt = null;
while (index < vetor.size()) {
data = vetor.get(index).split(" |\t");
dados = data[0] + " " + data[1];
dataAtual = new Timestamp(strToDateH(dados).getTime());
if ((dataAnt != null) && (dataAtual.getTime() == dataAnt.getTime())) {
vetorRelatorioDh.add(vetor.get(index));
erros++;
vetor.remove(index);
} else {
dataAnt = dataAtual;
index++;
}
}
if (erros != 0)
GerarRel(vetorRelatorioDh);
JOptionPane.showMessageDialog(null, "Relatório Gerado com sucesso: "
+ erros);
}
public static void verificaDia(ArrayList<String> vetor)
throws ParseException {
int index = 0;
String dados;
String data[];
Timestamp dataAtual = null;
Timestamp dataAnt = null;
while (index < vetor.size()) {
data = vetor.get(index).split(" |\t");
dados = data[0];
dataAtual = new Timestamp(strToDate(dados).getTime());
if ((dataAnt != null)
&& (dataAnt.getTime() + 86400000 != dataAtual.getTime())) {
dataAtual = new Timestamp(dataAnt.getTime() + 86400000);
Date outraData = new Date(dataAtual.getTime());
String ref = "-99,9";
String dataTratada = converteData(outraData) + "\t" + ref;
vetor.add(index, dataTratada);
}
dataAnt = dataAtual;
index++;
}
}
public static void verifica1hora(ArrayList<String> vetor)
throws ParseException {
int index = 0;
String dados;
String data[];
Timestamp dataAtual = null;
Timestamp dataAnt = null;
while (index < vetor.size()) {
data = vetor.get(index).split(" |\t");
dados = data[0] + " " + data[1];
dataAtual = new Timestamp(strToDateH(dados).getTime());
if ((dataAnt != null)
&& (dataAnt.getTime() + 3600000 != dataAtual.getTime())) {
dataAtual = new Timestamp(dataAnt.getTime() + 3600000);
Date outraData = new Date(dataAtual.getTime());
String ref = "-99,9";
String dataTratada = converteDataH(outraData) + "\t" + ref;
vetor.add(index, dataTratada);
}
dataAnt = dataAtual;
index++;
}
}
public static void verifica30min(ArrayList<String> vetor)
throws ParseException {
int index = 0;
String dados;
String data[];
Timestamp dataAtual = null;
Timestamp dataAnt = null;
while (index < vetor.size()) {
data = vetor.get(index).split(" |\t");
dados = data[0] + " " + data[1];
dataAtual = new Timestamp(strToDateH(dados).getTime());
if ((dataAnt != null)
&& (dataAnt.getTime() + 1800000 != dataAtual.getTime())) {
dataAtual = new Timestamp(dataAnt.getTime() + 1800000);
Date outraData = new Date(dataAtual.getTime());
String ref = "-99,9";
String dataTratada = converteDataH(outraData) + "\t" + ref;
vetor.add(index, dataTratada);
}
dataAnt = dataAtual;
index++;
}
}
public static void verifica15min(ArrayList<String> vetor)
throws ParseException {
int index = 0;
String dados;
String data[];
Timestamp dataAtual = null;
Timestamp dataAnt = null;
while (index < vetor.size()) {
data = vetor.get(index).split(" |\t");
dados = data[0] + " " + data[1];
dataAtual = new Timestamp(strToDateH(dados).getTime());
if ((dataAnt != null)
&& (dataAnt.getTime() + 900000 != dataAtual.getTime())) {
dataAtual = new Timestamp(dataAnt.getTime() + 900000);
Date outraData = new Date(dataAtual.getTime());
String ref = "-99,9";
String dataTratada = converteDataH(outraData) + "\t" + ref;
vetor.add(index, dataTratada);
}
dataAnt = dataAtual;
index++;
}
}
public static void verifica10min(ArrayList<String> vetor)
throws ParseException {
int index = 0;
String dados;
String data[];
Timestamp dataAtual = null;
Timestamp dataAnt = null;
while (index < vetor.size()) {
data = vetor.get(index).split(" |\t");
dados = data[0] + " " + data[1];
dataAtual = new Timestamp(strToDateH(dados).getTime());
if ((dataAnt != null)
&& (dataAnt.getTime() + 600000 != dataAtual.getTime())) {
dataAtual = new Timestamp(dataAnt.getTime() + 600000);
Date outraData = new Date(dataAtual.getTime());
String ref = "-99,9";
String dataTratada = converteDataH(outraData) + "\t" + ref;
vetor.add(index, dataTratada);
}
dataAnt = dataAtual;
index++;
}
}
}