[RESOLVIDO] Importe de arquivo CSV

boa noite
estou tentando importar um arquivo csv, mas no meio da importação ele aparece o erro…

java.lang.ArrayIndexOutOfBoundsException: 3
at com.principal.Monitoramento.csv(Monitoramento.java:167)
at com.principal.Monitoramento$1.run(Monitoramento.java:78)

o valor existe, não esta zerado.
o arquivo csv tem 3559 linhas, ele importa até a linha 1764 e para com o erro.

seque código

o erro é na linha " pln0048r.setPick(valores[3]);"

   public void csv(){
      Path a = Paths.get("K:\\arquivo\\0048.csv");
        boolean exists = Files.exists(a);
        boolean notExists = Files.notExists(a);
        if (exists) {
        System.out.println("File exists!");
        System.out.println("executando");
        Pln0048r pln0048r = new Pln0048r();
        Pln0048rJpaDAO.getInstance().removeAll();
        System.out.println("excluir pln0048r");
        File arquivoCSV = new File ("K:\\arquivo\\0048.csv");
        try{
        String linha = new String();
        Scanner scan = new Scanner(arquivoCSV);
        scan.nextLine();
        System.out.println(arquivoCSV);
        System.out.println("inserindo");
        while(scan.hasNext()) {
        linha = scan.nextLine();
           String[] valores = linha.split(";");
             if(valores[0].length() > 0) {
                 pln0048r.setCd(valores[0]);
                 pln0048r.setConferente(valores[1]);
                 pln0048r.setNome(valores[2]);
                 pln0048r.setPick(valores[3]);
                 pln0048r.setVolume(valores[4]);
                 pln0048r.setCliente(valores[5]);
                 pln0048r.setRazao(valores[6]);
                 pln0048r.setRota(valores[7]);
                 pln0048r.setRoteiro(valores[8]);
                 pln0048r.setData(valores[9]);
                 pln0048r.setEstacao(valores[10]);
                 pln0048r.setProduto(valores[11]);
                 pln0048r.setDescricao(valores[12]);
                 pln0048r.setLote(valores[13]);
                 pln0048r.setValidade(valores[14]);
                 pln0048r.setQtd(valores[15]);
                 Pln0048rJpaDAO.getInstance().merge(pln0048r);
                 System.out.println(valores[3]  +   valores[4]);
               //   linha  = scan.nextLine();
           }
          }
        scan.close();
        arquivoCSV.delete();
        System.out.println("fim da importação");
      }catch(Exception e) {
        e.printStackTrace();
      }
     } else if (notExists) {
      System.out.println("File doesn't exist!");
     } 
   }

alguma ideia sobre o erro?

Você está tentando acessar a posição 3 do array, mas ele só tem 3 posições: 0, 1 e 2.

ele tem 16 posições… ele importou 1764 linhas ai apareceu o erro… mas aproxima linha tem todas as informações.

Em algum momento ele só tem 3.
Dá uma depurada.

staroski
deu um depurar, ele mostrou que não a linha 389 não tem a posição 3, mas a posição existe e tem informção.
nessa posição digitei na mão o valor e rodei novamente, mas na linha 391 acusou que a a posição 15 não existe, mas também existe e tem informação nela…
como faço para quando aparecer esse tipo de erro ela pular a linha e continuar importando?

A JVM não é burra, se ela diz que não há posição X no array, então não há.

Não olhe no arquivo, olhe o conteúdo do seu array:

String[] valores = linha.split(";");
for (int x = 0; x < valores.length; x++) {
    System.out.println("posição " + x + " = " + valores[x]);
}

ele esta retornando que não existe a posição…
só uma duvida, se o meu arquivo esta completo, como o java retornando posição inexistente.
é o codigo que digitei errado?

Manda imprimir também a linha, antes de fazer o split.

System.out.println("linha = \"" + linha + "\"");
String[] valores = linha.split(";");
for (int x = 0; x < valores.length; x++) {
    System.out.println("posição " + x + " = " + valores[x]);
}

Posta aqui o valor da linha que não contém todas as posições.

staroski

linha = “SPI;14600710;LUCIANA MUZEL ; 439.425; 5;W15542;DROGAL FARMACEUTICA LTDA ;766;051;12/07/2018; 8; 706092;EUCERIN GEL OIL CONTR FPS60 52; ; ; 12”
posição 0 = SPI
posição 1 = 14600710
posição 2 = LUCIANA MUZEL
posição 3 = 439.425
posição 4 = 5
posição 5 = W15542
posição 6 = DROGAL FARMACEUTICA LTDA
posição 7 = 766
posição 8 = 051
posição 9 = 12/07/2018
posição 10 = 8
posição 11 = 706092
posição 12 = EUCERIN GEL OIL CONTR FPS60 52
posição 13 =
posição 14 =
posição 15 = 12
linha = "SPI;00404587;GRACE VALERETTO CAPELOSSA "
posição 0 = SPI
posição 1 = 00404587
posição 2 = GRACE VALERETTO CAPELOSSA
fim da importação

segue imagem do arquivo csv

Essa linha só tem 3 campos separados por ;

Abre o CSV com um editor de texto e confira o conteúdo dessa linha.

confirmei e existe mais informaçoes…

segue imagem

staroski

abri no editor de texto e a linha contem todas as informações.

segue imagem 1

segue imagem 2

Se você observar a linha "SPI;00404587;GRACE VALERETTO CAPELOSSA " realmente só possui 3 campos separados por ; então não tem como acessar mais.

Imagens do arquivo não ajudam, pois não dá pra copiar o conteúdo. :frowning:
De qualquer forma, na imagem postada nem aparece a linha que você tem problema: "SPI;00404587;GRACE VALERETTO CAPELOSSA "

Utilize este método e veja o que será impresso na saída:

public void csv() {
    File arquivoCSV = new File("K:\\arquivo\\0048.csv");
    System.out.println("Importando arquivo: \"" + arquivoCSV.getAbsolutePath() + "\"");
    if (arquivoCSV.exists()) {
        Pln0048rJpaDAO pln0048rJpaDAO = Pln0048rJpaDAO.getInstance();
        pln0048rJpaDAO.removeAll();
        try {
            BufferedReader reader = new BufferedReader(new FileReader(arquivoCSV));
            reader.readLine(); // ignorar 1ª linha
            String linha = null;
            while ((linha = reader.readLine()) != null) {
                String[] campos = linha.split(";");
                System.out.println("Campos da linha \"" + linha + "\" {");
                for (int i = 0; i < campos.length; i++) {
                    System.out.println("    " + i + ": \"" + campos[i] + "\"");
                }
                System.out.println("}");

                Pln0048r pln0048r = new Pln0048r();
                pln0048r.setCd(campos[0]);
                pln0048r.setConferente(campos[1]);
                pln0048r.setNome(campos[2]);
                pln0048r.setPick(campos[3]);
                pln0048r.setVolume(campos[4]);
                pln0048r.setCliente(campos[5]);
                pln0048r.setRazao(campos[6]);
                pln0048r.setRota(campos[7]);
                pln0048r.setRoteiro(campos[8]);
                pln0048r.setData(campos[9]);
                pln0048r.setEstacao(campos[10]);
                pln0048r.setProduto(campos[11]);
                pln0048r.setDescricao(campos[12]);
                pln0048r.setLote(campos[13]);
                pln0048r.setValidade(campos[14]);
                pln0048r.setQtd(campos[15]);
                pln0048rJpaDAO.merge(pln0048r);
            }
            reader.close();
            arquivoCSV.delete();
            System.out.println("Fim da importação");
        } catch (Exception e) {
            e.printStackTrace();
        }
    } else {
        System.out.println("Arquivo não existe");
    }
}

Não esta aparecendo a linha que você tem problema: "SPI;00404587;GRACE VALERETTO CAPELOSSA "
pois é outro arquivo e agora ela para na "SPI;00400096; “AGATA NAYARA MARONI”.

é o mesmo erro.

show…
importou corretamente… Resolveu o problema… muito obrigado pela ajuda… vlwwwwwwwwww