Validacao arquivo Txt com pipes

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.

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.

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.

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

[quote=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.

[/quote]

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]: {}, 

[quote=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

[/quote] Eu gosto muito do StringUtils do commons-lang3 da Apache. Tudo null-safe.

[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

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.

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]

…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]

…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]

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:

[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();//*

        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");


    }
}

}[/code]

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

[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();//*

        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");  


    }  
}  

} [/code]

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.

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

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.

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

[code]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");


    }
}

}[/code]