Olá comunidade, estou tentando fazer uma busca da seguinte maneira, pegar uma data de uma linha de um arquivo de texto até outra linha. Por exemplo, do dia 01/01/2018 até o dia 01/05/2018. Tenho 2 comboBox um “a partir…” e outro “até…” do jeito que está abaixo ele pega só o primeiro comboBox.
BufferedReader in = new BufferedReader(new FileReader(arquivo));
String dados = null;
String tex;
while (in.ready()) {
dados = in.readLine(); // pega a linha do txt
texto.add(dados); // armazena a linha do txt
if (dados.contains((String) comboDia.getSelectedItem() + (String) comboMes.getSelectedItem() + (String) comboAno.getSelectedItem())) {
tex = dados;
jTextArea1.append(tex + "\n");
}
}
in.close();
Tentei colocar um laço assim mas não deu certo:
for(int i=comboDia.getSelectedIndex(); i<comboDia1.getSelectedIndex(); i++)
Ola
se eu entendi certo, o seu arquivo contem datas e vc quer imprimir desde x ate y ( incluso as bordas do intervalo )
pois bem: vc precisa de um criterio de começo e um criterio de parada.
boolean comecou = false
while( in.ready()) {
linha = in.readLine()
if( comecou ) {
// imprime linha
}
if( comecou && /* verifique se vc chegou ao fim */ ) {
comecou = false; // ou use break; para sair do loop
}
if ( !comecou && /* verifique se vc chegou ao inicio */ ){
comecou = true
}
}
agora defina os criterios de comeco e fim
mas não teria que pegar os valores do comboBox? Fiz assim e não funcionou…
boolean comecou = false;
while (in.ready()) {
dados = in.readLine();
texto.add(dados);
if(comecou){
tex = dados;
jTextArea1.append(tex + "\n");
}
if (comecou && dados.contains((String) comboDia.getSelectedItem() + (String) comboMes.getSelectedItem() + (String) comboAno.getSelectedItem())) {
comecou = false;
}
if (comecou && dados.contains((String) comboDia1.getSelectedItem() + (String) comboMes1.getSelectedItem() + (String) comboAno1.getSelectedItem())){
comecou = true;
}
}
Qual o layout das linhas do arquivo?
Qual o formato das datas?
Estão em quais posições?
Não basta você fazer um if (linha.contains(data)) { }
.
Você precisa verificar se a data que existe na linha do arquivo está dentro do intervalo de datas desejado.
as linhas seriam assim:
000000108325112017063601397184127846
000000108325112018063601397184127846
(Em negrito, a sequencia é dia, mês e ano)
As datas estão em um comboBox
Esse intervalo que não estou conseguindo fazer…
Está assim:

private void exemplo() throws Exception {
SimpleDateFormat formato = new SimpleDateFormat("ddMMyyyy");
Date inicio = formato.parse((String) comboDiaDe.getSelectedItem() + (String) comboMesDe.getSelectedItem() + (String) comboAnoDe.getSelectedItem());
Date fim = formato.parse((String) comboDiaAte.getSelectedItem() + (String) comboMesAte.getSelectedItem() + (String) comboAnoAte.getSelectedItem());
BufferedReader entrada = new BufferedReader(new FileReader(arquivo));
StringBuilder texto = new StringBuilder();
String linha = null;
while ((linha = entrada.readLine()) != null) {
String campoData = linha.substring(10, 18); // posiçoes correspondentes à data na linha do arquivo
Date data = formato.parse(campoData);
if (estaDentroDoPeriodo(data, inicio, fim)) {
texto.append(campoData).append("\n");
}
}
entrada.close();
jTextArea1.setText(texto.toString());
}
private boolean estaDentroDoPeriodo(Date data, Date de, Date ate) {
if (data.equals(de)) {
return true;
}
if (data.equals(ate)) {
return true;
}
return data.after(de) && data.before(ate);
}
retornou
java.text.ParseException: Unparseable date: "LPbdrY/v"
at java.text.DateFormat.parse(DateFormat.java:366)
ja add o import java.util.Date;
private void limpar() throws Exception {
//List<String> texto = new ArrayList();
String arquivoT = caminho;
File arquivo = new File(arquivoT);
SimpleDateFormat formato = new SimpleDateFormat("ddMMyyyy");
Date inicio = formato.parse((String) comboDia.getSelectedItem() + (String) comboMes.getSelectedItem() + (String) comboAno.getSelectedItem());
Date fim = formato.parse((String) comboDia1.getSelectedItem() + (String) comboMes1.getSelectedItem() + (String) comboAno1.getSelectedItem());
BufferedReader entrada = new BufferedReader(new FileReader(arquivo));
StringBuilder texto = new StringBuilder();
String linha = null;
while ((linha = entrada.readLine()) != null) {
String campoData = linha.substring(10, 18); // posiçoes correspondentes à data na linha do arquivo
Date data = formato.parse(campoData);
if (estaDentroDoPeriodo(data, inicio, fim)) {
texto.append(campoData).append("\n");
}
}
entrada.close();
jTextArea1.setText(texto.toString());
}
private boolean estaDentroDoPeriodo(Date data, Date de, Date ate) {
if (data.equals(de)) {
return true;
}
if (data.equals(ate)) {
return true;
}
return data.after(de) && data.before(ate);
}
e chamo com um botao:
try {
limpar();
} catch (Exception ex) {
Logger.getLogger(Abrir.class.getName()).log(Level.SEVERE, null, ex);
}
Você disse que as linhas eram assim "000000108325112017063601397184127846"
, nesse caso o campo data está entre as posições 10 e 18, se suas linhas são diferentes, você tem que ajustar o código pra extrair a data da posição certa.
Sim. Desculpe, na ultima linha tinha um outro formato de texto… Porém agora retornou apenas a data 0101208 e não veio com o restante da linha, precisava da linha toda, teria que usar o readLine()?
O exemplo que postei somente usa o readLine()
.