Buscar linhas de arquivo com jComboBox

9 respostas
java
G

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++)

9 Respostas

P

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

G

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;
                    
                }
            }
S

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.

G

as linhas seriam assim:

[telefone removido]25112017063601397184127846
[telefone removido]25112018063601397184127846

(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:
guj

S
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);
}
G

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);
        }
S

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.

G

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()?

S

O exemplo que postei somente usa o readLine().

Criado 26 de julho de 2018
Ultima resposta 1 de ago. de 2018
Respostas 9
Participantes 3