Tratamento de extrato bancário em txt para em Java

Boa tarde pessoal,

Sou novo em Java e estou fazendo um texto bastante complicado para quem é iniciante. Preciso extrair apenas alguns dados de um extrato em txt para que sejam exibidos em determinada tela.

Essa é a estrutura do extrato no Notepad++.

================================================================================================================================================================
Extrato conta corrente A33B291136634142013
29/08/2017 11:43:41

Cliente - Cliente atual

Agência 3041-4
Conta corrente 140154-8 LINEA VERDE ALIM LTDA
Período do extrato

Lançamentos

Dt. movimento Dt. balancete Ag. origem Lote Histórico Documento Valor R$ Saldo
25/08/2017 0000 00000 000 Saldo Anterior 367,26 C
28/08/2017 0426 16593 830 Depósito Online 4.261.659.300.644 1.388,38 C 1.755,64 C
28/08/2017 2287 15620 830 Depósito Online 22.871.562.000.451 1.749,05 C 3.504,69 C
28/08/2017 3508 99015 870 Transferência on line 553.508.000.042.914 1.615,26 C 5.119,95 C
28/08 3508 42914-7 EQUILÍBRIO VIT
28/08/2017 0038 99020 870 Transferência on line 600.038.000.102.662 263,12 C 5.383,07 C
28/08 0038 102662-3 KARINE A GOULA
28/08/2017 3126 99020 870 Transferência on line 603.126.000.113.256 799,00 C 6.182,07 C

                          28/08 3126     113256-3 NILSON WILVERT

28/08/2017 0000 14105 874 Transferência Agendada 65.500.000.018.764 274,34 C 6.456,41 C
28/08 0655 18764-X FERNANDA P F S
28/08/2017 0000 13113 431 Tar Depós Proces-Caixa 892.401.200.316.838 2,00 D 6.454,41 C
Tarifa referente a 28/08/2017
28/08/2017 0000 13113 431 Tar Depós Proces-Caixa 892.401.200.316.840 2,00 D 6.452,41 C
Tarifa referente a 28/08/2017
28/08/2017 0000 00000 345 BB Renda Fixa LP 100 2 6.452,41 D 0,00 C
29/08/2017 1307 01307 870 Transferência on line 601.307.000.023.828 468,70 C 468,70 C
29/08 1307 23828-7 LIVIA MILHOMEM
29/08/2017 0000 00000 999 S A L D O 468,70 C 468,70 C

I

Basicamente preciso seguir esses passos:

1 - Fazer o sistema “desconsiderar” as 12 primeiras linhas do extrato;
2 - Quando ler Dt. Movimento (13ª linha) entender que o extrato começa na próxima linha (14ª linha);
2a) Começar a ler o extrato a partir da 1ª data da 14ª linha.
3 - Tirar os espaços até o código de operação;
3a) Operação começa na coluna 61 e vai até a 63.
3b) Código de operação possui 3 dígitos.
4 - Fazer o sistema entender que estes 3 dígitos definem a operação realizada (TED, DOC, Débito em conta, etc…);
5 - Ler o valor da operação;
5a) Valor vai da coluna 122 a 129.
6 - Jogar os dados dentro de um array.

Mas não faço ideia de como começar.

Poderia me ajudar?

Obrigado.

Boa tarde amigo já fiz algo parecido para ler arquivo vou te enviar um exemplo aqui:

Você vai usar essa classe para ler o Arquivo BufferedReader na classe abaixo tem alguns exemplos como eu pego a partir de algo escrito e posição, espero que ajude.

public class ProcessarArquivoLog {

public void processarArquivoLog (BufferedReader bufferedReaderArquivLog) {
    
    //Cria Uma Lista Para Armazenar Os Rankings
    List<Ranking> listaRanking = new ArrayList<>();
    
    //Cria Uma Lista Para Armazenar Os Jogadores
    List<Jogador> listaJogador = new ArrayList<>();

    //Adiciona O Jogador Roman
    Jogador jogadorRoman = new Jogador();
    jogadorRoman.setCodigoJogador(1);
    jogadorRoman.setNomeJogador("Roman");
    listaJogador.add(jogadorRoman);

    //Adiciona O Jogador Nick
    Jogador jogadorNick = new Jogador();
    jogadorNick.setCodigoJogador(2);
    jogadorNick.setNomeJogador("Nick");
    listaJogador.add(jogadorNick);
    
    try {
        
    //Lê A Primeira Linha Do Log Do Jogo
    String linhaArquivoLog = bufferedReaderArquivLog.readLine();

    //Cria A Partida
    Partida partida = new Partida();
    Ranking ranking = new Ranking();                    

    //Verifica A Linha Se Tem New Match Para Pegar O Número Da Partida
    if (linhaArquivoLog.contains("New match")) {

        String[] codigoPartida = linhaArquivoLog.split(" ");
        
        Double codigoPartidaDouble = new Double(Double.valueOf(codigoPartida[5]));

        partida.setCodigoPartida(codigoPartidaDouble);

        //Incluí O Jogador Roman No Ranking
        ranking.setPartida(partida);
        ranking.setJogador(jogadorRoman);
        listaRanking.add(ranking);
        
        //Incluí O Jogador Nick No Ranking
        partida = new Partida();
        ranking = new Ranking();
        
        partida.setCodigoPartida(codigoPartidaDouble);
        ranking.setPartida(partida);
        ranking.setJogador(jogadorNick);
        
        listaRanking.add(ranking);

    }

    System.out.println(linhaArquivoLog);

    while (linhaArquivoLog != null) {
        
        //Faz As Contagens Das Mortes Sofridas Pelos Outros Jogadores
        if (linhaArquivoLog.contains("killed") && linhaArquivoLog.contains("using")) {
            
            String[] nomeJogador = linhaArquivoLog.split(" ");
            
            for (Ranking rankingAssasinatos : listaRanking) {
                
                if (rankingAssasinatos.getJogador().getNomeJogador().equalsIgnoreCase(nomeJogador[3])) {
                    
                    Integer quantidadeAssasinatos = ranking.getPartida().getQuantidadeAssasinatos();
                    
                    rankingAssasinatos.getPartida().setQuantidadeAssasinatos(++quantidadeAssasinatos);
                }
                
                if (rankingAssasinatos.getJogador().getNomeJogador().equalsIgnoreCase(nomeJogador[5])) {

                    Integer quantidadeMortes = rankingAssasinatos.getPartida().getQuantidadeMortes();

                    rankingAssasinatos.getPartida().setQuantidadeMortes(++quantidadeMortes);

                }
            }
        }
        
        //Faz As Contagens Das Mortes Sofridas Pelo <WORLD>
        if (linhaArquivoLog.contains("<WORLD> killed")) {
            
            String[] nomeJogador = linhaArquivoLog.split(" ");
            
            for (Ranking rankingMortes : listaRanking) {

                if (rankingMortes.getJogador().getNomeJogador().equalsIgnoreCase(nomeJogador[5])) {

                    Integer quantidadeMortes = rankingMortes.getPartida().getQuantidadeMortes();

                    rankingMortes.getPartida().setQuantidadeMortes(++quantidadeMortes);

                }
            }
        }

        linhaArquivoLog = bufferedReaderArquivLog.readLine();

        System.out.println(linhaArquivoLog);

    }
    
    
    //Fecha O Arquivo Lido
    bufferedReaderArquivLog.close();
    
    //Monta O Ranking Final Da Partida
    String rankingFinalJogo = "\n";
    rankingFinalJogo += "Ranking Dev Amil 1.0 ";
    rankingFinalJogo += "\n";
    
    for (Ranking rankingFinal : listaRanking) {
        
        rankingFinalJogo += "\n";
        rankingFinalJogo += "Partida: " + rankingFinal.getPartida().getCodigoPartida();
        rankingFinalJogo += "\n";
        rankingFinalJogo += "Jogador: " + rankingFinal.getJogador().getNomeJogador();
        rankingFinalJogo += "\n";
        rankingFinalJogo += "Quantidade De Assasinatos: " + rankingFinal.getPartida().getQuantidadeAssasinatos();
        rankingFinalJogo += "\n";
        rankingFinalJogo += "Quantidade De Mortes: " + rankingFinal.getPartida().getQuantidadeMortes();
        rankingFinalJogo += "\n";

        if (rankingFinal.getPartida().getQuantidadeMortes() == 0) {
            
            rankingFinalJogo += "Parabéns Você Ganhou Um 'award' Por Não Morrer Nenhuma Vez Durante A Partida!";
            rankingFinalJogo += "\n";
            
        }
    }
    
    System.out.println(rankingFinalJogo);
    
    } catch (Exception e) {
    
        System.out.println("Erro :" + e);
        
    }

}
}