Separar dados de um arquivos de texto mediante tabulação e jogar num banco de dados.

15/01/2015

0

Boa tarde.

Gostaria de saber como faço para separar, utilizando java, dados de um arquivo de texto e popular no banco de dados.

Este é o arquivo que quero separar.


DIRF|2014|2013|N||F8UCL6S|
RESPO|11122233344|FULANO RESPONSAVEL POR TUDO|88|35313531||35313531||
DECPJ|07007007000107|PREFEITURA MUNICIPAL DO MUNICIPIO|2|00762606312|N|N|N|N|N|N|N||
IDREC|0561|
BPFDEC|00011122252|BELTRANO DE TAL||
RTRT|15000|15000|22500|22500|22500|22500|90400|15000|15000|15000|22500|22500|22500|
RTPO|2255|2255|5025|5025|5025|5025|7232|2255|2255|2255|5025|5025|5025|
BPFDEC|00038658356|CICLANO DE TAL||
RTRT||||||||52525|22500|122500|122500|122500|69917|
RTPO||||||||4158|5025|15102|15102|15102|5593|


Gostaria de alocar cada valor em seu referido campo. Por exemplo.

//dados responsavel
String cpfResponsavel = '11122233344'; //(valor encontrado na linha que inicia com RESPO)
String nomeResponsavel = 'FULANO RESPONSAVEL POR TUDO'; //(valor encontrado na linha que inicia com RESPO)
//dados municipio
String cnpjMunicipio = '07007007000107'; //(valor encontrado na linha que inicia com DECPJ)
String nomeMunicipio = 'PREFEITURA MUNICIPAL DO MUNICIPIO'; //(valor encontrado na linha que inicia com DECPJ)
//dados contribuinte
String cpfContribuinte = '00011122252'; //(valor encontrado na linha que inicia com BPFDEC)
String nomeContribuinte = 'BELTRANO DE TAL'; //(valor encontrado na linha que inicia com BPFDEC)
//valores contribuinte
double valorJaneiro = 150.00; //(valor encontrado na linha que inicia com RTRT)
double valorFevereiro = 150.00; //(valor encontrado na linha que inicia com RTRT)
/* . . .  Percebam que os valores estão na linha RTRT e são separados por | . . . */
double valorDecimo = 225.00; //(valor encontrado na linha que inicia com RTRT)
//
double valorDescontoJaneiro = 22.55; //(valor encontrado na linha que inicia com RTPO)
double valorDescontoFevereiro = 22.55; //(valor encontrado na linha que inicia com RTPO)
/* . . .  Percebam que os valores estão na linha RTPO e são separados por | . . . */
double valorDescontoDecimo = 50.25; //(valor encontrado na linha que inicia com RTPO)


* Adicionei os valores direto as variáveis somente para título de entendimento, neste caso devemos usar alguma estrutura de repetição.

No caso do contribuinte CICLANO DE TAL veja que na linhas que iniciam com RTRT e RTPO não tem valores dos meses iniciais.


RTRT||||||||52525|22500|122500|122500|122500|69917|
RTPO||||||||4158|5025|15102|15102|15102|5593|


Nestas linhas RTRT e RTPO temos espaço para valores mensais de janeiro a dezembro + o valor de décimo terceiro. Onde, entre os | | não tiver valor, devo preencher o campo com 0.0.

Desde já agradeço.
Renato Junior

Renato Junior

Responder

Posts

16/01/2015

Ronaldo Lanhellas

Aqui cabe um algoritmo para leitura do arquivo separado por pipe, o que não é trivial e não da para resolver em 3 linhas de código. O que você já tem pronto ? Poste aqui para que possa lhe ajudar melhor.

Dica: leia o arquivo usando FileReader, depois separe os dados de cada linha pelo pipe ("|") usando o split(), depois faça um laço nesse array de strings e vá atribuindo as respectivos atributos desejados. Faça isso para todas as linhas.
Responder

16/01/2015

Renato Junior

Olá Ronaldo Lanhellas,

Obrigado pela resposta.

Iniciando as tentativas fiz desta forma:

public static void main(String[] args) {

		try {

			BufferedReader buffer = new BufferedReader(new FileReader(
					"Arquivo.DEC"));
			String linha = null;
			while ((linha = buffer.readLine()) != null) {
				String[] linhaSeparado = linha.split("[|]");
				for (String r : linhaSeparado) {
					System.out.println(r.toString());
				}
			}

		} catch (IOException e) {
			// TODO: handle exception
		}

	}


Desta forma já consegui separar tudo que está entre os |.

Pensei em criar minhas variáveis e, dentro do loop, testar as linhas da seguinte forma.

			while ((linha = buffer.readLine()) != null) {
				String[] linhaSeparado = linha.split("[|]");
				for (String r : linhaSeparado) {
					if (r.substring(0, 6).equalsIgnoreCase("BPFDEC")) {
						cpf = r.toString();
					}
				}
			}


Se eu adicionar nesta condição outra variável para receber o nome do contribuinte (valor posterior ao cpf) teria de avançar no array. Mais não consegui prosseguir para a captura de cada valor individual.
Responder

16/01/2015

Ronaldo Lanhellas

Este é o caminho, só falta ajustar algumas coisas, vamos lá:

1 - Você sabe o nome de cada coluna, então pode fixar isso.
2 - Não precisa usar substring() pois os valores já estão divididos por conta do split().

Ficaria assim:

String nomeAtual, idadeAtual;
while ((linha = buffer.readLine()) != null) {
    String[] linhaSeparado = linha.split("[|]");
     for(int i =0; i < linhaSeparado.length(); i++){
       switch (i){
           case 1: nomeAtual = linhaSeparado[i];
           case 2: idadeAtual = linhaSeparado[i];
       }
   }
}
Responder

16/01/2015

Renato Junior

Entendi.

Seria assim:

		try {

			BufferedReader buffer = new BufferedReader(new FileReader(
					"D:\\ProjetosFonts\\workspace\\imprimedirf\\DIRF2014_2.DEC"));
			String linha = null;
			//
			String cpfResponsavel = null, nomeResponsavel = null, cnpj = null, municipio = null, contribuinte = null, cpf = null;
			Double vJan = 0.0, vFev = 0.0, vMar = 0.0, vAbr = 0.0, vMai = 0.0, vJun = 0.0, vJul = 0.0, vAgo = 0.0, vSet = 0.0, vOut = 0.0, vNov = 0.0, vDez = 0.0, vDec = 0.0;
			Double descJan, descFev, descMar, descMai, descJun, descJul, descAgo, descSet, descOut, descNov, descDez, descDec;
			//
			while ((linha = buffer.readLine()) != null) {
				String[] linhaSeparado = linha.split("[|]");

				for (int i = 0; i < linhaSeparado.length; i++) {

					switch (linhaSeparado[i]) {
					case "RESPO":
						cpfResponsavel = linhaSeparado[i + 1];
						nomeResponsavel = linhaSeparado[i + 2];
						System.out.println("Responsavel: " + cpfResponsavel + " - " + nomeResponsavel);
						break;

					case "DECPJ":
						cnpj = linhaSeparado[i + 1];
						municipio = linhaSeparado[i + 2];
						System.out.println("Município: " + cnpj + " - " + municipio);
						break;
					
					case "BPFDEC":
						cpf = linhaSeparado[i + 1];
						contribuinte = linhaSeparado[i + 2];
						System.out.println("Contribuinte: " + cpf + " - " + contribuinte);
						break;
						
					case "RTRT":
						vJan = Double.parseDouble(linhaSeparado[i + 1].equals("")?"0.0":linhaSeparado[i + 1]); 
						vFev = Double.parseDouble(linhaSeparado[i + 2].equals("")?"0.0":linhaSeparado[i + 2]);
						vMar = Double.parseDouble(linhaSeparado[i + 3].equals("")?"0.0":linhaSeparado[i + 3]); 
						vAbr = Double.parseDouble(linhaSeparado[i + 4].equals("")?"0.0":linhaSeparado[i + 4]);
						vMai = Double.parseDouble(linhaSeparado[i + 5].equals("")?"0.0":linhaSeparado[i + 5]);
						vJun = Double.parseDouble(linhaSeparado[i + 6].equals("")?"0.0":linhaSeparado[i + 6]);
						vJul = Double.parseDouble(linhaSeparado[i + 7].equals("")?"0.0":linhaSeparado[i + 7]);
						vAgo = Double.parseDouble(linhaSeparado[i + 8].equals("")?"0.0":linhaSeparado[i + 8]);
						vSet = Double.parseDouble(linhaSeparado[i + 9].equals("")?"0.0":linhaSeparado[i + 9]);
						vOut = Double.parseDouble(linhaSeparado[i + 10].equals("")?"0.0":linhaSeparado[i + 10]);
						vNov = Double.parseDouble(linhaSeparado[i + 11].equals("")?"0.0":linhaSeparado[i + 11]);
						vDez = Double.parseDouble(linhaSeparado[i + 12].equals("")?"0.0":linhaSeparado[i + 12]);
						vDec = Double.parseDouble(linhaSeparado[i + 13].equals("")?"0.0":linhaSeparado[i + 13]);
						
						System.out.println(	" Jan: " + vJan + 
											" Fev: " + vFev +
											" Mar: " + vMar +
											" Abr: " + vAbr +
											" Mai: " + vMai +
											" Jun: " + vJun +
											" Jul: " + vJul +
											" Ago: " + vAgo +
											" Set: " + vSet +
											" Out: " + vOut +
											" Nov: " + vNov +
											" Dez: " + vDez +
											" Dec: " + vDec
											);
						break;
					}
				}

			}

		} catch (IOException e) {
			// TODO: handle exception
		}


Nos casos em que não tenho valores entre os | usei, por exemplo:

vDec = Double.parseDouble(linhaSeparado[i + 13].equals("")?"0.0":linhaSeparado[i + 13]); 


para não dar Exception (empty String).

** Os valores estão sem a pontuação das casas decimais, ou seja, esse valor 69917 na realidade deveria ser 699.17... Existe alguma forma para separar esta casa decimal? Eu fiz de uma forma mais ficou muito "tosco".

						vDec = Double.parseDouble(linhaSeparado[i + 13].equals("")?"0.0":(
								linhaSeparado[i + 13].substring(0,linhaSeparado[i + 13].length()-2) + "." + 
								linhaSeparado[i + 13].substring(linhaSeparado[i + 13].length()-2)
								));
Responder

16/01/2015

Ronaldo Lanhellas

Faça assim para colocar o "." na casa decimal:

Double.valueOf(linha.substring(1,5) + "." + linha.substring(5,7))


Acima representa um número de 7 dígitos, ex: 0008969
Que ficaria assim no final: 89.69
Responder

16/01/2015

Ronaldo Lanhellas

Faça assim para colocar o "." na casa decimal:

Double.valueOf(linha.substring(1,5) + "." + linha.substring(5,7))


Acima representa um número de 7 dígitos, ex: 0008969
Que ficaria assim no final: 89.69
Responder

17/01/2015

Renato Junior

Ronaldo,

Desta forma
Double.valueOf(linha.substring(1,5) + "." + linha.substring(5,7))

Apresenta o seguinte erro:
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 7

** Outra coisa. As linhas normalmente tem todos os valores

RTRT|||48152|84165|91740|91740|39254|91740|91740|91740|91740|91740|68805|

Quando tenho linhas que não tem o último valor

RTRT|||48152|84165|91740|91740|39254|91740|91740|91740|91740|91740||

Apresenta o seguinte erro:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 13

Como se não tivesse a última posição no array.

Pode me da uma luz?
Desde já te agradeço.
Responder

19/01/2015

Ronaldo Lanhellas

Ronaldo,

Desta forma
Double.valueOf(linha.substring(1,5) + "." + linha.substring(5,7))

Apresenta o seguinte erro:
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 7

** Outra coisa. As linhas normalmente tem todos os valores

RTRT|||48152|84165|91740|91740|39254|91740|91740|91740|91740|91740|68805|

Quando tenho linhas que não tem o último valor

RTRT|||48152|84165|91740|91740|39254|91740|91740|91740|91740|91740||

Apresenta o seguinte erro:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 13

Como se não tivesse a última posição no array.

Pode me da uma luz?
Desde já te agradeço.


Em primeiro lugar o exemplo que dei de "1,5" e "5,7" foi apenas uma demonstração, você tem que checar o tamanho de cada campo seu e ver o índice onde ficará o "ponto", não basta apenas colocar 1,5 e depois 5,7, por isso está dando este erro de IndexOutOfBounds. Em segundo lugar os campos vazios você deve checar antes de realizar este tratamento, se forem vazios apenas passe por eles.
Responder

05/04/2016

Chadu

Caro Renato,

Conseguiu concluir o seu projeto?

Também estou trabalhando num projeto parecido com o seu...

Gostaria de saber também se já colocou num banco...

Até mais.
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar