Validacao arquivo Txt com pipes

16 respostas
M

Bom dia!
Sou novato em programação em java.
Até minha lógica ainda não é bem estruturada.srsrsrs
Estou com um problema preciso validar um arquivo txt tipo:
|Venda|Loja50|Segunda| LInha 1
|Regve|50,30||500,25| LInha 2
|Venda|Loja50|Terca| LInha 3
|Regve|50,30||| linha 4
onde
a limitação por campos sejam exclusivamente os pipes;
as informações nos dois primeiros pipes são o tipo do registro.
Os demais formando algo assim:
|Venda| Loja| dia da semana |
|Registro de venda|1º turno|2º turno|3º turno|
Gostaria de validadar tipo quando o registro no turno for vazio, mostrar qual loja e dia da semana teve essa venda e somar a venda do dia.
Fiz algo com split, mas quando o campo ficou vazio foi como se não existisse.

16 Respostas

nel

Enxergo o split como a maneira correta de tratar cada linha do se arquivo TXT.
Se o seu TXT é uniforme, ou seja, cada coluna sempre terá um único valor, você pode verificar pela posição do array.
O que me refiro, é se sempre a coluna 1 é nome, a 2 é idade, a 3 é cpf e assim por diante, entende ?

Se a coluna três é onde é armazenado o turno, por exemplo, uma verificação simples é ver se a posição 3 (array[2]) é nula ou está vazia, caso seja, ai realiza uma determinada ação. Acredito que isso resolva sua necessidade.

M

Obrigado pela atenção.
Vou passar um pouco do meu código.
O que acontece com meu codigo dá erro quando em campo vazio e para.

Mikhas

Não sei qual seu objetivo final com esse arquivo, mas uso o BeanIO para trabalhar com arquivos textos e acho muito bom.

http://www.beanio.org/docs/reference/index.html

E

MPires:
Bom dia!
Sou novato em programação em java.
Até minha lógica ainda não é bem estruturada.srsrsrs
Estou com um problema preciso validar um arquivo txt tipo:
|Venda|Loja50|Segunda| LInha 1
|Regve|50,30||500,25| LInha 2
|Venda|Loja50|Terca| LInha 3
|Regve|50,30||| linha 4
onde
a limitação por campos sejam exclusivamente os pipes;
as informações nos dois primeiros pipes são o tipo do registro.
Os demais formando algo assim:
|Venda| Loja| dia da semana |
|Registro de venda|1º turno|2º turno|3º turno|
Gostaria de validadar tipo quando o registro no turno for vazio, mostrar qual loja e dia da semana teve essa venda e somar a venda do dia.
Fiz algo com split, mas quando o campo ficou vazio foi como se não existisse.

Você precisa passar o parâmetro -1 para Split. Veja um exemplo:

package guj;

public class ExemploSplit {

    /**
     * @param args
     */
    public static void main(String[] args) {
        String[] exemplos = {
            "|Venda|Loja50|Segunda|",
            "|Regve|50,30||500,25|",
            "|Venda|Loja50|Terca|",
            "|Regve|50,30|||",
        };
        for (String exemplo : exemplos) {
            System.out.printf ("{%s}: ", exemplo);
            String[] campos = exemplo.split ("\\|", -1);
            for (int i = 0; i < campos.length; ++i) {
                System.out.printf ("[%d]: {%s}, ", i, campos[i]);
            }
            System.out.println ();
        }

    }

}

Saida:

{|Venda|Loja50|Segunda|}: [0]: {}, [1]: {Venda}, [2]: {Loja50}, [3]: {Segunda}, [4]: {}, 
{|Regve|50,30||500,25|}: [0]: {}, [1]: {Regve}, [2]: {50,30}, [3]: {}, [4]: {500,25}, [5]: {}, 
{|Venda|Loja50|Terca|}: [0]: {}, [1]: {Venda}, [2]: {Loja50}, [3]: {Terca}, [4]: {}, 
{|Regve|50,30|||}: [0]: {}, [1]: {Regve}, [2]: {50,30}, [3]: {}, [4]: {}, [5]: {},
jaboot

Mikhas:
Não sei qual seu objetivo final com esse arquivo, mas uso o BeanIO para trabalhar com arquivos textos e acho muito bom.

http://www.beanio.org/docs/reference/index.html

Eu gosto muito do StringUtils do commons-lang3 da Apache. Tudo null-safe.

M

[code]String Arquivo = "Loja.txt";
try {

InputStream is = new FileInputStream(Arquivo);
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String linha = br.readLine();

while (linha != null) {
String[] a = linha.split("\\|");
System.out.println(a[1]);
try {
if ("Regve".equals(a[1])) {
Double turno1 = Double.parseDouble(a[2].replace(",", "."));
Double turno2 = Double.parseDouble(a[3].replace(",", "."));
Double turno3 = Double.parseDouble(a[4].replace(",", "."));
Double somaVenda = turno1 + turno2 + turno3;
System.out.println("Registro de venda " + somaVenda);
}

} catch (ArrayIndexOutOfBoundsException arr) {
System.out.println("sem dados" + arr);
}
linha = br.readLine();
}
br.close();
isr.close();
is.close();
} catch (FileNotFoundException e) {
System.out.println("Arquvio não existe");
} catch (IOException e) {
System.out.println("Não é possível Ler o Arquivo");

}
}
}

Erro/saida
run:
Venda
Regve
Exception in thread "main" java.lang.NumberFormatException: empty String
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1011)
at java.lang.Double.parseDouble(Double.java:540)
at arquivos.Loja.main(Loja.java:37)
Java Result: 1

nel

Leu o que o entanglement disse ? :slight_smile:
Porque não vi isso aplicado ao seu código (esqueceu de fechar a tag code) .

E o seu erro é simples:

Double.parseDouble(" ");

Gera o mesmo erro que está tendo.

M

Mas no caso de entanglement, a validação dele não lê o arquivo.
Ele criou uma variação vetor que não é possível com o método read.line. Como no meu código
[/code]String Arquivo = "Loja.txt";
try {

InputStream is = new FileInputStream(Arquivo);
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String linha = br.readLine();[code]

M

...Corrigindo

Mas no caso de entanglement, a validação dele não lê o arquivo.
Ele criou um vetor que não é possível com o método read.line. Como no meu código
[/code]String Arquivo = "Loja.txt";
try {

InputStream is = new FileInputStream(Arquivo);
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String linha = br.readLine();[code]

M

...Corrigindo

Mas no caso de entanglement, a validação dele não lê o arquivo. Ele criou um vetor que não é possível com o método read.line. Como no meu código
String Arquivo = "Loja.txt"; 
try { 


InputStream is = new FileInputStream(Arquivo); 
InputStreamReader isr = new InputStreamReader(is); 
BufferedReader br = new BufferedReader(isr); 
String linha = br.readLine();
M

Entendi o que o entanglement falou, porém agora não consigo acabar com os espaços vazios.
Alguém me ajuda.
E depois preciso mostrar apenas a loja que teve algum turno sem venda.

Obrigado. :oops:

String Arquivo = "Loja.txt";
        try {
            InputStream is = new FileInputStream(Arquivo);
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);
            String linha = br.readLine();//*

            for (int i = 0; linha != null; i++) {


                String[] a = linha.split("\\|", -1);

                try {
                    if ("Regve".equals(a[1])) {
                        Double turno1 = Double.parseDouble(a[2].replace(",", "."));
                        Double turno2 = Double.parseDouble(a[3].replace(",", "."));
                        Double turno3 = Double.parseDouble(a[4].replace(",", "."));
                        Double somaVenda = turno1 + turno2 + turno3;
                        System.out.println("Registro de venda " + somaVenda);
                    }

                } catch (ArrayIndexOutOfBoundsException arr) {
                    System.out.println("sem dados" + arr);
                }
                linha = br.readLine();

                br.close();
                isr.close();
                is.close();
            }

        } catch (FileNotFoundException e) {
            System.out.println("Arquvio não existe");
        } catch (IOException e) {
            System.out.println("Não é possível Ler o Arquivo");


        }
    }
}
M

...Corrigindo

Entendi o que o entanglement falou, porém agora não consigo acabar com os espaços vazios,digo passar o valor de vazio para 0.
Alguém me ajuda.
E depois preciso mostrar apenas a loja que teve algum turno sem venda.

Obrigado.

String Arquivo = "Loja.txt";  
        try {  
            InputStream is = new FileInputStream(Arquivo);  
            InputStreamReader isr = new InputStreamReader(is);  
            BufferedReader br = new BufferedReader(isr);  
            String linha = br.readLine();//*  
  
            for (int i = 0; linha != null; i++) {  
  
  
                String[] a = linha.split("\\|", -1);  
  
                try {  
                    if ("Regve".equals(a[1])) {  
                        Double turno1 = Double.parseDouble(a[2].replace(",", "."));  
                        Double turno2 = Double.parseDouble(a[3].replace(",", "."));  
                        Double turno3 = Double.parseDouble(a[4].replace(",", "."));  
                        Double somaVenda = turno1 + turno2 + turno3;  
                        System.out.println("Registro de venda " + somaVenda);  
                    }  
  
                } catch (ArrayIndexOutOfBoundsException arr) {  
                    System.out.println("sem dados" + arr);  
                }  
                linha = br.readLine();  
  
                br.close();  
                isr.close();  
                is.close();  
            }  
  
        } catch (FileNotFoundException e) {  
            System.out.println("Arquvio não existe");  
        } catch (IOException e) {  
            System.out.println("Não é possível Ler o Arquivo");  
  
  
        }  
    }  
}
heat

NA verdade a melhor maneira, e mais performática eh através de expressão regular

http://docs.oracle.com/javase/tutorial/essential/regex/

Você pode tanto fazer para validar sua expressão como recuperar os campos necessários.

M

Cara,
estou vendo que vou ter estudar mais java.
Não estou conseguindo mesmo.

H

tambem estou com um problema parecido,
preciso somar as linhas que contem as notas de cada bimestre por aluno, se houver alguma nota em branco devo mostrar de qual aluno é e de qual materia.

o layout do arquivo é mais ou menos assim:

|regAluno|matricula|nome|serie|
|regNota|portugues|matematica|historia|geografia| primeiro bimestre
|regNota|portugues|matematica|historia|geografia|
|regNota|portugues|matematica|historia|geografia|
|regNota|portugues|matematica|historia|geografia| quarto bimestre

exemplo de situaçao:

|regAluno|0001|saulo|7ª|
|regNota|20|15|13|21| primeiro bimestre
|regNota|14|22|18|19|
|regNota|15|13|15|18|
|regNota|15|17||15|

preciso somar as notas e retornar a nota do aluno que tiver em branco, mostrando qual aluno e qual materia falta lançar a nota.

não sei como eliminar o espaço em branco e como mostrar de qual aluno a nota esta faltando.

M

Boa tarde!
tive que fazer com o meu aqui, olha se ajuda?

ublic class Loja {

    public static void main(String[] args) {
        String Arquivo = "Loja.txt";
        try {
            InputStream is = new FileInputStream(Arquivo);
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);
            String linha = br.readLine();//*

            for (int i = 1; linha != null; i++) {


                String[] a = linha.split("\\|", -1);
                
//if ( a[i].trim().isEmpty()) {  
//    a[i] = "0";  
//} 
                for (int pos=1;pos<a.length-1;pos++){
                    if (a[pos].equals(""))
                        a[pos]="0";
                }

                try {
                   
                        if("Regve".equals(a[1])){
                        Double turno1 = Double.parseDouble(a[2].replace(",", "."));
                        Double turno2 = Double.parseDouble(a[3].replace(",", "."));
                        Double turno3 = Double.parseDouble(a[4].replace(",", "."));
                        Double somaVenda = turno1 + turno2 + turno3;
                        System.out.println("Registro de venda " + somaVenda );
                    }

                } catch (ArrayIndexOutOfBoundsException arr) {
                    System.out.println("sem dados" + arr);
                }
                linha = br.readLine();

            }  br.close();
                isr.close();
                is.close();
            

        } catch (FileNotFoundException e) {
            System.out.println("Arquvio não existe");
        } catch (IOException e) {
            System.out.println("Não é possível Ler o Arquivo");


        }
    }
}
Criado 28 de março de 2012
Ultima resposta 12 de abr. de 2012
Respostas 16
Participantes 7