Expressão regular em TXT

2 respostas
fagnerfernandes

Pessoal boa tarde,

Seguinte eu criei uma aplicação em JAVA que trata um arquivo TXT enviado por um grande cliente.
O que eu preciso é inserir no BD as informações deste TXT antecipada-mente manipulado (tratado).
Os nomes que estão entre “parênteses” são os nomes das tabelas no BD, depois de cada linha onde tem os “parênteses” é o nome dos campos no BD, após isso tenho as informações/registros que preciso inserir no banco.
O “%%EOF” é onde termina os registros daquela tabela e logo abaixo se inicia outra.

Estou com muita dificuldade para tratar os nomes das tabelas e o nome dos campos da tabela que estão no TXT, se fosse por exemplo tudo a mesma tabela e não tivesse o nome dos campos eu consigo tranqüilo, mas não estou conseguindo fazer uma expressão regular para fazer desta forma.

Segue abaixo o conteúdo do TXT:

(VA44)
ESTIPULANTE|APOLICE|NUM_CERTIF|DT_VIG|SEGURADO|CPF|CAPIT1|CAPIT2|CAPIT3|CAPIT4|CAPIT5|CAPIT6|CAPIT7|CAPIT8|CAPIT9|CAPIT10|DT_CAPIT|CONTA_DEBITO|CUSTO|DIA_COB|BENEF1|PARENT1|PART1|BENEF2|PARENT2|PART2|BENEF3|PARENT3|PART3|BENEF4|PARENT4|PART4|BENEF5|PARENT5|PART5|DTPOSTAGEM|NUMOBJETO|DESTINATARIO|ENDERECO|BAIRRO|CIDADE|UF|CEP|REMETENTE|REMET_ENDERECO|REMET_BAIRRO|REMET_CIDADE|REMET_UF|CODIGO_CIF|POSTNET|REMET_CEP|N_CUSTO|DATADIA|CLIENTE|DT_VIG1|DT_VIG2|TEXTO|
dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|MENSAGEM AAAAAAAA
dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|MENSAGEM AAAAAAAA
dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|MENSAGEM AAAAAAAA
%%EOF
(VA52)
NOME1|APOLICE|NUM_CERTIF|DT_VIG|SEGURADO|CPF|CAPIT1|CAPIT2|CAPIT3|CAPIT4|CAPIT5|CAPIT6|CAPIT7|CAPIT8|CAPIT9|CAPIT10|DT_CAPIT|CONTA_DEBITO|CUSTO|DIA_COB|BENEF1|PARENT1|PART1|BENEF2|PARENT2|PART2|BENEF3|PARENT3|PART3|BENEF4|PARENT4|PART4|BENEF5|PARENT5|PART5|DTPOSTAGEM|NUMOBJETO|DESTINATARIO|ENDERECO|BAIRRO|CIDADE|UF|CEP|REMETENTE|REMET_ENDERECO|REMET_BAIRRO|REMET_CIDADE|REMET_UF|CODIGO_CIF|POSTNET|REMET_CEP|N_CUSTO|DATADIA|CLIENTE|DT_VIG1|DT_VIG2|TEXTO
dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|MENSAGEM BBBBBBBB
dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|MENSAGEM BBBBBBBB
%%EOF
(SF13)
SEGURADO|BILHETE|NUMSORTEIO|DTPOSTAGEM|NUMOBJETO|DESTINATARIO|ENDERECO|BAIRRO|CIDADE|UF|CEP|REMETENTE|REMET_ENDERECO|REMET_BAIRRO|REMET_CIDADE|REMET_UF|REMET_CEP|CODIGO_CIF|POSTNET
dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|MENSAGEM CCCCCCCCC
%%EOF
(VA52)
NOME1|APOLICE|NUM_CERTIF|DT_VIG|SEGURADO|CPF|CAPIT1|CAPIT2|CAPIT3|CAPIT4|CAPIT5|CAPIT6|CAPIT7|CAPIT8|CAPIT9|CAPIT10|DT_CAPIT|CONTA_DEBITO|CUSTO|DIA_COB|BENEF1|PARENT1|PART1|BENEF2|PARENT2|PART2|BENEF3|PARENT3|PART3|BENEF4|PARENT4|PART4|BENEF5|PARENT5|PART5|DTPOSTAGEM|NUMOBJETO|DESTINATARIO|ENDERECO|BAIRRO|CIDADE|UF|CEP|REMETENTE|REMET_ENDERECO|REMET_BAIRRO|REMET_CIDADE|REMET_UF|CODIGO_CIF|POSTNET|REMET_CEP|N_CUSTO|DATADIA|CLIENTE|DT_VIG1|DT_VIG2|TEXTO
dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|MENSAGEM BBBBBBBB
dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|dados|MENSAGEM BBBBBBBB
%%EOF

Obrigado.

2 Respostas

Adelar

Olá,

não é necessário usar expressão regular. Utilize StringTokenizer para separar cada campo lido (http://www.inf.pucrs.br/~flash/lapro2/aula_gui3.html). Utilize o caractere ‘|’ como delimitador:

StringTokenizer st = new StringTokenizer(linha, "|");

[]'s

InSeOfKn

Uma solução seria ter uma class com atributos que guardem as informações de cada bloco (me refiro ao dado entre um %%EOF e outro) do txt, que poderia ser +/- assim:

public class Bloco {
	private String tableName;
	private String[] Fields;
	private List<String[]> data ;
	
	public Bloco(){
		data = new ArrayList<String[]>();
	}

	//getters end setters
	
	public void addData(String[] strs) {
		data.add(strs);
	}
}
e la na class da leitura ter um List e uma variável para guardar a referencia do ultimo bloco e no loop de leitura do txt fazer +/- assim:
Bloco lastBloco;
		int lineType = TABLE_NAME;
		
		while(scanner.hasNextLine()){
			String line = scanner.nextLine();
			if(line.equals("%%EOF")){
				lineType = TABLE_NAME;
				continue;
			}
			if(lineType == TABLE_NAME){
				lastBloco = new Bloco();
				lastBloco.setTableName(line.substring(1, line.length()-1));
				listBlocos.add(lastBloco);
				lineType = FIELDS;
				continue;
			}
			
			if(lineType == FIELDS) {
				lastBloco.setFields(line.split("|"));
				lineType = DATE;
				continue;
			}
			
			if(lineType == DATE){
				lastBloco.addData(line.split("|"));
			}
		}

dai depois é só percorrer o List de Blocos e ir usando os getters para pegar os dados e persistir no banco! :D

até!

Criado 9 de maio de 2011
Ultima resposta 9 de mai. de 2011
Respostas 2
Participantes 3