Ajuda no Projeto de Migração de arquivo txt com validação para SqlServer 2008

Bom dia;
Iniciando mais um projeto.

Estou recebendo um arquivo txt do cliente com aproximadamente 200.000 registros.
Preciso validar campos como cpf, rg, data emissao e em seguida armazenar na base de dados.

Dados do txt por linha
23333477818270220999SPSSP 20091603
23333477818270220999SPSSP 20091603
23333477818270220999SPSSP 20091603

Através do codigo consegui ler apenas a primeira linha…Preciso ler as demais…
Obrigado. Anderson.


package alistamento;
import java.io.BufferedReader;
import java.io.FileReader;
import java.util.StringTokenizer;

public class Main {
  
   public void arquivo() {   
      String linha = null;   
  
      try {   
         FileReader reader = new FileReader("Projeto.txt");  //ARRUMAR......Usuario precisa escolher o diretorio onde localiza o txt
         BufferedReader leitor = new BufferedReader(reader);   
         StringTokenizer st = null;   
  
         while ((linha = leitor.readLine()) != null) {   
            st = new StringTokenizer(linha, "\t");   
            
            String dados = null;
  
            while (st.hasMoreTokens()) {   
  
               // Campo 1   
               dados = st.nextToken();   
               System.out.println(dados);   
               System.out.println("Tokens encontrados " + st.countTokens());
               // Campo 2   
               dados = st.nextToken();   
               System.out.println(dados);   
  
               System.out.println("-------");   
            }   
         }   
         leitor.close();   
         reader.close();   
  
      } catch (Exception e) {   
         e.printStackTrace();   
      }   
   }   
  
   public static void main(String[] args) {   
      Main t = new Main();
      t.arquivo();   
   }   
}  

Retornou o erro:

run:
java.util.NoSuchElementException
23333477818270220999SPSSP 20091603
Tokens encontrados 0
at java.util.StringTokenizer.nextToken(StringTokenizer.java:332)
at alistamento.Main.arquivo(Main.java:42)
at alistamento.Main.main(Main.java:58)
CONSTRUÍDO COM SUCESSO (tempo total: 0 segundos)

Consegui trazer os campos, porem so nao esta trazendo a ultima linha do txt…
Alguem para ajudar???


package alistamento;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.util.StringTokenizer;
import javax.swing.JOptionPane;

public class Testando {

    
    public void arquivo() throws FileNotFoundException, IOException {
        
        File arquivoLeitura = new File("Projeto.txt");
        long tamanhoArquivo = arquivoLeitura.length();
        FileInputStream fs = new FileInputStream(arquivoLeitura);
        DataInputStream in = new DataInputStream(fs);
        LineNumberReader lineRead = new LineNumberReader(new InputStreamReader(in));
        lineRead.skip(tamanhoArquivo);
        int numLinhas = lineRead.getLineNumber() + 1;
        System.out.println("O ARQUIVO CONTEM " + numLinhas + " LINHAS!!!!!!!");

        String linha = null;

        int i = 0;

        try {

            FileReader reader = new FileReader(arquivoLeitura);
            BufferedReader br = new BufferedReader(reader);


            for (i = 0; i < numLinhas; i++) {
                String s = br.readLine(); // variavel para receber o relatorio do ponto
                while ((s = br.readLine()) != null) {

                    System.out.println(s.substring(0, 11) + ";" + s.substring(11, 22) + ";" + s.substring(22, 23) + ";" + s.substring(23, 25) + ";"
                            + s.substring(25, 31) + ";" + s.substring(31, 39) + ";" + s.substring(39, 51) + ";" + s.substring(51, 66) + ";"
                            + s.substring(66, 70) + ";" + s.substring(70, 74) + ";" + s.substring(74, 76) + ";" + s.substring(76, 106) + ";"
                            + s.substring(106, 140) + ";" + s.substring(140, 143) + ";" + s.substring(143, 177) + ";" + s.substring(177, 180) + ";" + s.substring(180, 212) + ";"
                            + s.substring(212, 262) + ";" + s.substring(262, 270) + ";" + s.substring(270, 271) + ";" + s.substring(271, 272) + ";" + s.substring(272, 273) + ";"
                            + s.substring(273, 274) + ";" + s.substring(274, 329) + ";" + s.substring(329, 334) + ";" + s.substring(334, 344) + ";" + s.substring(344, 364) + ";"
                            + s.substring(364, 388) + ";" + s.substring(388, 390) + ";" + s.substring(390, 398) + ";" + s.substring(398, 400) + ";" + ";" + s.substring(400, 408) + ";"
                            + s.substring(408, 432) + ";" + s.substring(432, 434) + ";" + s.substring(434, 436) + ";" + s.substring(436, 440) + ";" + s.substring(440, 444) + ";"
                            + s.substring(444, 448) + ";" + s.substring(448, 449) + ";" + s.substring(449, 459) + ";" + s.substring(459, 469) + ";" + s.substring(469, 477) + ";");
                }

            }
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, e.getMessage(), "Atenção", JOptionPane.WARNING_MESSAGE);
        }



    }

    public static void main(String[] args) throws FileNotFoundException, IOException {
        Testando t = new Testando();
        t.arquivo();
    }
}

Tira o for e ve se vai até a última linha. Inicializa a String s com vazio.

Consegui resolver alterando o codigo.

Porém ao gravar o novo arquivo txt, a ultima linha está em branco devido ao codigo + System.getProperty (“line.separator”));
Gostaria que essa linha fosse apagada…
Abraços…


/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package alistamento;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.io.PrintWriter;
import java.util.StringTokenizer;
import javax.swing.JOptionPane;


public class Aprendendo {


 public void arquivo() throws FileNotFoundException, IOException {

  try {

        File arquivoLeitura = new File("DISA2.txt");
        long tamanhoArquivo = arquivoLeitura.length();
        FileInputStream fs = new FileInputStream(arquivoLeitura);
        DataInputStream ini = new DataInputStream(fs);
        LineNumberReader lineRead = new LineNumberReader(new InputStreamReader(ini));
        lineRead.skip(tamanhoArquivo);
        int numLinhas = lineRead.getLineNumber() + 1;
        System.out.println("O ARQUIVO CONTEM " + numLinhas + " LINHAS!!!!!!!");


  FileWriter x = new FileWriter("Teste1.txt",true);

  BufferedReader in = new BufferedReader(
  new FileReader(arquivoLeitura));
  String s;
  while ((s = in.readLine()) != null) {
      
      
  x.write(s.substring(0, 11) + ";" + s.substring(11, 22) + ";" + s.substring(22, 23) + ";" + s.substring(23, 25) + ";"
                            + s.substring(25, 31) + ";" + s.substring(31, 39) + ";" + s.substring(39, 51) + ";" + s.substring(51, 66) + ";"
                            + s.substring(66, 70) + ";" + s.substring(70, 74) + ";" + s.substring(74, 76) + ";" + s.substring(76, 106) + ";"
                            + s.substring(106, 140) + ";" + s.substring(140, 143) + ";" + s.substring(143, 177) + ";" + s.substring(177, 180) + ";" + s.substring(180, 212) + ";"
                            + s.substring(212, 262) + ";" + s.substring(262, 270) + ";" + s.substring(270, 271) + ";" + s.substring(271, 272) + ";" + s.substring(272, 273) + ";"
                            + s.substring(273, 274) + ";" + s.substring(274, 329) + ";" + s.substring(329, 334) + ";" + s.substring(334, 344) + ";" + s.substring(344, 364) + ";"
                            + s.substring(364, 388) + ";" + s.substring(388, 390) + ";" + s.substring(390, 398) + ";" + s.substring(398, 400) + ";" + ";" + s.substring(400, 408) + ";"
                            + s.substring(408, 432) + ";" + s.substring(432, 434) + ";" + s.substring(434, 436) + ";" + s.substring(436, 440) + ";" + s.substring(440, 444) + ";"
                            + s.substring(444, 448) + ";" + s.substring(448, 449) + ";" + s.substring(449, 459) + ";" + s.substring(459, 469) + ";" + s.substring(469, 477) + ";" + System.getProperty ("line.separator"));





  }
  x.close();
  in.close();
 } catch (IOException e) {
 }

    }


public static void main(String[] args) throws FileNotFoundException, IOException {
        Aprendendo t = new Aprendendo();
        t.arquivo();
           }

}

De cabeça não lembro de nenhuma solução clássica, mas da pra fazer um gabiara:
tira o System.getProperty (“line.separator”) do final e coloca no começo com uma condição, de ser imprimdo da segunda linha pra frente.
Exemplo:


//fora do while
boolean primeiraLinha = true;
while(){
          x.write((!primeiraLinha ? System.getProperty ("line.separator") : "")+" "+...);
          primairaLinha = false;
}

Penso que dessa forma pode dar certo, faz um teste.

Consegui ajustar, utilizei um contador e a instrução if trazendo o write sem pular linha…
O codigo para quem precisar:



/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package alistamento;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.io.PrintWriter;
import java.util.StringTokenizer;
import javax.swing.JOptionPane;

public class Aprendendo {


 public void arquivo() throws FileNotFoundException, IOException {

  try {

        File arquivoLeitura = new File("DISA2.txt");
        long tamanhoArquivo = arquivoLeitura.length();
        FileInputStream fs = new FileInputStream(arquivoLeitura);
        DataInputStream ini = new DataInputStream(fs);
        LineNumberReader lineRead = new LineNumberReader(new InputStreamReader(ini));
        lineRead.skip(tamanhoArquivo);
        int numLinhas = lineRead.getLineNumber() + 1;
        System.out.println("O ARQUIVO CONTEM " + numLinhas + " LINHAS!!!!!!!");


  FileWriter x = new FileWriter("Teste1.txt",true);

  BufferedReader in = new BufferedReader(
  new FileReader(arquivoLeitura));
  String s;
  int count=0;
  while ((s = in.readLine()) != null) {
      count++;
      
     
if (count==numLinhas){
 x.write(s.substring(0, 11) + ";" + s.substring(11, 22) + ";" + s.substring(22, 23) + ";" + s.substring(23, 25) + ";"
                            + s.substring(25, 31) + ";" + s.substring(31, 39) + ";" + s.substring(39, 51) + ";" + s.substring(51, 66) + ";"
                            + s.substring(66, 70) + ";" + s.substring(70, 74) + ";" + s.substring(74, 76) + ";" + s.substring(76, 106) + ";"
                            + s.substring(106, 140) + ";" + s.substring(140, 143) + ";" + s.substring(143, 177) + ";" + s.substring(177, 180) + ";" + s.substring(180, 212) + ";"
                            + s.substring(212, 262) + ";" + s.substring(262, 270) + ";" + s.substring(270, 271) + ";" + s.substring(271, 272) + ";" + s.substring(272, 273) + ";"
                            + s.substring(273, 274) + ";" + s.substring(274, 329) + ";" + s.substring(329, 334) + ";" + s.substring(334, 344) + ";" + s.substring(344, 364) + ";"
                            + s.substring(364, 388) + ";" + s.substring(388, 390) + ";" + s.substring(390, 398) + ";" + s.substring(398, 400) + ";" + ";" + s.substring(400, 408) + ";"
                            + s.substring(408, 432) + ";" + s.substring(432, 434) + ";" + s.substring(434, 436) + ";" + s.substring(436, 440) + ";" + s.substring(440, 444) + ";"
                            + s.substring(444, 448) + ";" + s.substring(448, 449) + ";" + s.substring(449, 459) + ";" + s.substring(459, 469) + ";" + s.substring(469, 477) + ";");

      break;
      }

 x.write(s.substring(0, 11) + ";" + s.substring(11, 22) + ";" + s.substring(22, 23) + ";" + s.substring(23, 25) + ";"
                            + s.substring(25, 31) + ";" + s.substring(31, 39) + ";" + s.substring(39, 51) + ";" + s.substring(51, 66) + ";"
                            + s.substring(66, 70) + ";" + s.substring(70, 74) + ";" + s.substring(74, 76) + ";" + s.substring(76, 106) + ";"
                            + s.substring(106, 140) + ";" + s.substring(140, 143) + ";" + s.substring(143, 177) + ";" + s.substring(177, 180) + ";" + s.substring(180, 212) + ";"
                            + s.substring(212, 262) + ";" + s.substring(262, 270) + ";" + s.substring(270, 271) + ";" + s.substring(271, 272) + ";" + s.substring(272, 273) + ";"
                            + s.substring(273, 274) + ";" + s.substring(274, 329) + ";" + s.substring(329, 334) + ";" + s.substring(334, 344) + ";" + s.substring(344, 364) + ";"
                            + s.substring(364, 388) + ";" + s.substring(388, 390) + ";" + s.substring(390, 398) + ";" + s.substring(398, 400) + ";" + ";" + s.substring(400, 408) + ";"
                            + s.substring(408, 432) + ";" + s.substring(432, 434) + ";" + s.substring(434, 436) + ";" + s.substring(436, 440) + ";" + s.substring(440, 444) + ";"
                            + s.substring(444, 448) + ";" + s.substring(448, 449) + ";" + s.substring(449, 459) + ";" + s.substring(459, 469) + ";" + s.substring(469, 477) + ";" + System.getProperty ("line.separator"));






  }
  x.close();
  in.close();
 } catch (IOException e) {
 }

    }



public static void main(String[] args) throws FileNotFoundException, IOException {
        Aprendendo t = new Aprendendo();
        t.arquivo();
    }

}

Estou agora na fase da validação dos dados que estao no txt…
Qd for verificado um erro, preciso gerar um txt que grave este dados.
Como faço para que os erros nos campos cpf e rg de cada linha venham sequenciados na mesma linha do txt???


if (s.substring(0, 11).toUpperCase().trim().matches("[0-9]{1,11}")) {

b.setCpf(s.substring(0, 11));

} else {
      countErros++;
      tMap.put(count, s.substring(0, 11));
     System.out.println("CPF inválido na linha " + count);
}

if (s.substring(11, 22).toUpperCase().trim().matches("[0-9]{1,11}")) {
b.setRg(s.substring(11, 22));
} else {
      countErros++;
      tMap.put(count, s.substring(11, 22));
      System.out.println("RG inválido na linha " + count);
      }


  }

Console com System.out…
Estou tentando com TreeMap, é melhor???

run:
O ARQUIVO CONTEM 361024 LINHAS!!!
CPF inválido na linha 1
RG inválido na linha 1
CPF inválido na linha 361023
RG inválido na linha 361023
Encontrado(s) 4 erros
Linha1 CPF: x204796xx03
Linha361023 CPF: x2x298x3810
Linha 1 RG: 0x03560x042
Linha 361023 RG: 000x50x3244

Teria que vir assim
run:
O ARQUIVO CONTEM 361024 LINHAS!!!
Encontrado(s) 4 erros
linha 1 CPF inválido x204796xx03, RG inválido 0x03560x042
linha 361023 CPF inválido x2x298x3810, RG inválido 000x50x3244