ARQ Texto - Duvidas - [RESOLVIDO]

49 respostas
B

Pessoal…

volto aqui novamente com mais dúvidas, se puderem ajudar, agradeço a todos!!

No meu código abaixo:

while((leitor=reader.readLine() ) != null ) {     

                      String arquivoAbend = leitor;     
                      String[] novoArq = arquivoAbend.split(" ");     
                      StringBuffer linhaSaida  = new StringBuffer();

	                          
                      if(leitor.contains("ABENDED") || leitor.contains("FAILED") ||
                         leitor.contains("NOT CATLGD 2") || leitor.contains("UNEXPLA")){
	         
                          if(novoArq[13].length() > 8 && novoArq[4].equals("180211")){ 

                                  // DATA_PROCESSAMENTO
                                  linhaSaida.append(novoArq[2] + "  ");
                                  // HORA
                                  linhaSaida.append(novoArq[3] + "  ");
                                  // ODATE
                                  linhaSaida.append(novoArq[4] + "  ");               
                                  // JOB 
                                  linhaSaida.append(novoArq[13].substring(0,8) + "  ");
                                  // JOB_ID
                                  linhaSaida.append(novoArq[13].split("/")[1] + "  ");
                                  // OCORRENCIA
                                  linhaSaida.append(novoArq[15] + " " + novoArq[17]);
	                       }}    	
		        
                          //salva os ERROS na lista   
                                 dadosArquivo.add(linhaSaida.toString());

Eu estou extraindo informações de um arquivo texto separado por colunas. Neste arquivo, existem 4 tipos de erros no qual busco na linha OCORRENCIA. Porém cada mensagem de erro, esta em uma determinada posição.

Exemplo:

Se for ABENDED, a OCORRENCIA esta na posição: linhaSaida.append(novoArq[15] + " " + novoArq[17]);

Se for COND a OCORRENCIA esta na posição: linhaSaida.append(novoArq[16] + " " + novoArq[18]);

Se for FAILED a OCORRENCIA esta na posição: linhaSaida.append(novoArq[15] + " " + novoArq[16] + " " + novoArq[17]);

Se for UNEXPLA a OCORRENCIA esta na posição: linhaSaida.append(novoArq[15] + " " + novoArq[16] + " " + novoArq[17] + " " + novoArq[18] + " " + novoArq[19]);

Como eu posso fazer para obter todas as informações diferenciando apenas a coluna OCORRENCIA conforme exemplo acima ?

E outra coisa, eu estou executando o meu programa e agora ele tá retornando apenas linhas vazias, não sei o que acontece…

valeu…

49 Respostas

L

Sem o arquivo-base fica difícil de responder, mas eu utilizaria expressões regulares para capturar os valores, de acordo com cada ocorrência. Existem diversos materiais de expressões regulares, e é uma ferramenta poderosa para tratamentos de texto. Recomendo aprender!

B

Leo,

valeu pela ajuda, porém ainda me resta uma dúvida na seguinte situação:

quando meu IF é executado, ele pega todas as informações nas determinadas posições e adiciona tudo em uma arrayList. O Problema é que caso eu deixei a posição como esta em OCORRENCIAS : linhaSaida.append(novoArq[15] + " " + novoArq[17]); ele imprime para mim todas as linhas normalmente, porém algumas mensagem de erro vem do jeito que preciso e outras vem cortadas por que não estão na mesma posição.

como posso diferenciar as posições do item OCORRENCIAS de acordo com o meu IF que obtem as mensagem de erro quando adicionar as informações no ArrayList ?

Para cada mensagem de erro selecionada, somente o campo OCORRENCIAS terá que alterar as posições, as demais ficam iguais.

if(leitor.contains("ABENDED") || leitor.contains("FAILED") ||   
              leitor.contains("NOT CATLGD 2") || leitor.contains("UNEXPLA")){   
  
               if(novoArq[13].length() > 8 && novoArq[4].equals("180211")){   

                        ...inibido o restante dos dados
  
                       // OCORRENCIA   
                       linhaSaida.append(novoArq[15] + " " + novoArq[17]);   
             }}       
  
               //salva os ERROS na lista     
                      dadosArquivo.add(linhaSaida.toString());
L

Acho que não entendi a dúvida.

Seria isso?

if (leitor.contains("ABENDED")) linhaSaida.append(novoArq[15] + " " + novoArq[17]); else if (leitor.contains("FAILED")) linhaSaida.append(novoArq[16] + " " + novoArq[18]); else if (leitor.contains("COND")) linhaSaida.append(novoArq[15] + " " + novoArq[16] + " " + novoArq[17]); else if (leitor.contains("UNEXPLA")) linhaSaida.append(novoArq[15] + " " + novoArq[16] + " " + novoArq[17] + " " + novoArq[18] + " " + novoArq[19]);

Outro jeito seria fazer um Enum que tem um “getOcorrencia”, outro jeito seria fazendo expressões regulares diferentes para cada parte, etc. Mas se você quer ficar no if, acho que isso resolve?

B

Leo,

pensei nisso, até fiz, mas acabou que ele não conseguiu obter nada.

if(leitor.contains("ABENDED") || leitor.contains("FAILED") ||   
              leitor.contains("NOT CATLGD 2") || leitor.contains("UNEXPLA")){   
  
               if(novoArq[13].length() > 8 && novoArq[4].equals("180211")){   
  
                       // DATA_PROCESSAMENTO   
                       linhaSaida.append(novoArq[2] + "  ");   
                       // HORA   
                       linhaSaida.append(novoArq[3] + "  ");   
                       // ODATE   
                       linhaSaida.append(novoArq[4] + "  ");                 
                       // JOB   
                       linhaSaida.append(novoArq[13].substring(0,8) + "  ");   
                       // JOB_ID   
                       linhaSaida.append(novoArq[13].split("/")[1] + "  ");   
                       // OCORRENCIA   
                       linhaSaida.append(novoArq[15] + " " + novoArq[17]);

então, no meu código, eu já faço um IF para coletar todas as linhas que tenham os erros, e uso um outro IF abaixo para obter somente informações com 8 posições e que tenham uma determinada data.

Pois bem, ele pega todas as linhas normalmente, porém na parte da ocorrência é que dá problema pois ele corta as informações, vou dar um exemplo:

Modo que eu quero obter as informações:
ABENDED
COND
FAILED
UNEXPLA

Modo que o sistema esta pegando a informação:

ABENDED
CON
FA
UNEX

Entendeu ? quando deixo setado as posições na ocorrência, ele pega uma informação legal de um tipo de erro e nos outros ele corta, por que não estão na mesma posição. só o campo de ocorrência.

L

Você pode colocar umas linhas de cada tipo de exemplo, para facilitar? Sério que eu não estou entendendo… Pode ser só uma, e mesmo com conteúdo genérico (só respeitando os espaçamentos em branco, que é o que o split usa).

B

Claro Leo,

As linhas originais da log são assim:

190211 040754 180211 CTMG     SEL216W JOB YABJD588 YABGD588/46235 OID=QRS9V UNEXPLAINED COND CODE 0002 STEP ST02 /
180211 013226 170211 CTMG     SEL211W JOB BJBJ2Z2K BJBG2Z2K/05106 OID=QQN3Y FAILED- JCL ERROR IN STEP ST02 /
190211 015936 180211 CTMG     SEL206W JOB YLBJD555 YLBGD555/08031 OID=QRPEL ABENDED CC U0350 STEP ST07 /
180211 061621 170211 CTMG     SPY275E JOB JABJD890 JABGD890/76576 OID=QQQ8E NOT CATLGD 2 ON DSNAME

O que eu espero que o programa faça é deixar as linhas conforme abaixo abaixo:

190211 063359 180211 JABGD890  69645  NOT CATLGD 2 
190211 013315 180211 BJBJ2Z2K  81774  FAILED- JCL ERROR
190211 014729 180211 YLBGD555  00085  ABENDED CC U0350 
190211 040754 180211 YABJD588  46235  COND 0002

Então, as colunas são separadas nesta sequência: DATA_PROCESSAMENTO, HORA, ODATE, JOB, JOB_ID, OCORRENCIA, conforme mostrado no exemplo acima.

O que esta acontecendo:

No meu código, no IF eu faço ele procurar por estas informações acima e gravo elas em um ArrayList. Até tudo bem, isso está ocorrendo, o problema é que na opção OCORRENCIA, eu defini uma posição especifica para o erro “UNEXPLAINED COND CODE 0002 STEP ST03” e ele deixa a mensagem filtrada desta forma: “COND 0002.”

Porém, esta posição não serve para os demais erros: NOT CATLGD 2, FAILED- JCL ERROR e ABENDED CC U0350 , por que ? por que ao invés de pegar o erro assim ABENDED CC U0350
ele traz assim CC U0350 , esconde a palavra ABENDED, por que as posições para estas mensagens não são as mesmas. Cada uma esta em uma posição diferente.

Para que isso aconteça, utilizo este código abaixo:

while((leitor=reader.readLine() ) != null ) {       
  
           String arquivoAbend = leitor;       
           String[] novoArq = arquivoAbend.split(" ");       
           StringBuffer linhaSaida  = new StringBuffer();   
  
                   
           if(leitor.contains("ABENDED") || leitor.contains("FAILED") ||   
              leitor.contains("NOT CATLGD 2") || leitor.contains("UNEXPLA")){   
  
               if(novoArq[13].length() > 8 && novoArq[4].equals("180211")){   
  
                       // DATA_PROCESSAMENTO   
                       linhaSaida.append(novoArq[2] + "  ");   
                       // HORA   
                       linhaSaida.append(novoArq[3] + "  ");   
                       // ODATE   
                       linhaSaida.append(novoArq[4] + "  ");                 
                       // JOB   
                       linhaSaida.append(novoArq[13].substring(0,8) + "  ");   
                       // JOB_ID   
                       linhaSaida.append(novoArq[13].split("/")[1] + "  ");   
                       // OCORRENCIA   
                       linhaSaida.append(novoArq[15] + " " + novoArq[17]);   
             }}       
  
               //salva os ERROS na lista     
                      dadosArquivo.add(linhaSaida.toString());

Será que consegui explicar melhor ? :slight_smile:

valeuuu

B

Será que alguem poderia dar uma força ai ??..

valeu!!

L

Ficou bem mais fácil agora...

As 4 linhas vazias são porque seu IF que monta o stringbuffer nunca é "encontrado". Se você fizer a inserção de dentro do if, você vê que fica com uma lista vazia.

Dei uma organizada para facilitar a vida:
- Construa o objeto sempre com o menor escopo possível: por exemplo, o StringBuffer só é usado para montar a frase de erro, então, deixa ele dentro do if
- Não crie variáveis à toa: String é imutável, não tem necessidade a linha 3 do seu último post.

Veja como ficou. Agora é só customizar o if lá...

import java.util.ArrayList;
import java.util.List;

public class Main {

	public static void main(String[] args) throws Exception {
		String[] linhas = new String[] {
				"190211 040754 180211 CTMG     SEL216W JOB YABJD588 YABGD588/46235 OID=QRS9V UNEXPLAINED COND CODE 0002 STEP ST02 /",
				"180211 013226 170211 CTMG     SEL211W JOB BJBJ2Z2K BJBG2Z2K/05106 OID=QQN3Y FAILED- JCL ERROR IN STEP ST02 /",
				"190211 015936 180211 CTMG     SEL206W JOB YLBJD555 YLBGD555/08031 OID=QRPEL ABENDED CC U0350 STEP ST07 /",
				"180211 061621 170211 CTMG     SPY275E JOB JABJD890 JABGD890/76576 OID=QQQ8E NOT CATLGD 2 ON DSNAME",
		};
		
		List<String> dadosArquivo = new ArrayList<String>();
		for (String leitor : linhas) {       
			if(leitor.contains("ABENDED") || leitor.contains("FAILED") ||   
					leitor.contains("NOT CATLGD 2") || leitor.contains("UNEXPLA")){   
				String[] novoArq = leitor.split("\\s+"); //juntando os delimitadores para nao ter "item" vazio
				System.out.println(retornaListaNumerada(novoArq)); //ajuda a depurar as posições
				if(novoArq[8].length() > 8 && novoArq[2].equals("180211")){    //verifica condição nos parâmetros certos
					StringBuilder linhaSaida  = new StringBuilder(); //stringbuilder é mais ágil para esses casos
					linhaSaida.append(novoArq[2]).append("  ");	// DATA_PROCESSAMENTO      
					linhaSaida.append(novoArq[3]).append("  "); // HORA   
					linhaSaida.append(novoArq[4]).append("  ");	// ODATE                    
					linhaSaida.append(novoArq[7].substring(0,8)).append("  "); // JOB      
					linhaSaida.append(novoArq[7].split("/")[1]).append("  "); // JOB_ID   
					if (leitor.contains("UNEXPLA")) { // OCORRENCIA
						linhaSaida.append(novoArq[10] + " " + novoArq[12]);
					} else if (leitor.contains("NOT CATLGD 2")) {
						linhaSaida.append(novoArq[14]); // e assim por diante
					}

					dadosArquivo.add(linhaSaida.toString()); //adiciono dado só aqui, para evitar linha vazia
				}
			}	           
		}

		for (String dado : dadosArquivo) {
			System.out.println(dado);
		}
	}
	
	private static String retornaListaNumerada(String[] a) {
		if (a == null)
			return "null";
		int iMax = a.length - 1;
		if (iMax == -1)
			return "[]";

		StringBuilder b = new StringBuilder();
		b.append('[');

		for (int i = 0;; i++) {
			b.append(i).append(" = ").append(a[i]);
			if (i == iMax)
				return b.append(']').toString();
			b.append(", ");
		}
	}
}
B

Poxa leo, sem palavras para você…

Muitissimo Obrigado, já tava ficando doido com isso, pois isso é um sistema que vou usar para o serviço, e já estão me cobrando .hehehe.

Faltou só mais uma coisinha que eu não falei, mas só com toda essa sua explicação, já vou conseguir ir para frente.

Aquela variavel String arquivoAbend = leitor;eu a utilizei, por que o meu arquivo não está apenas com aquelas linhas que te passei, claro, elas existem e muitas outras iguais, porém tem muita sujeira no arquivo. e eu usei ela, para jogar as informações de todo o arquivo dentro dela e assim colunar as informações naquele String [] novoARQ.

naquele String [] linhas que você usou, eu posso fazer com que ele leia todo o arquivo ao invés de apenas aquelas linhas não posso ?

valeu…

L

:thumbup:
Pelo seu código, o leitor é somente a linha atual. O String[] era para simular o arquivo. Você pode ler todo o arquivo de uma vez com o FileUtils.readLines() do Apache Commons-IO. Recomendo dar uma olhada, se for fazer coisas com arquivo. Porém, é melhor ir lendo linha a linha, se o arquivo for muito grande!

B

Leo,

Então, alterei o código e deu certo, ficou desta forma:

ArrayList<String> dadosArquivo =  new ArrayList<String>();

while((leitor=reader.readLine() ) != null){

String[] novoArq = leitor.split(" "); //juntando os delimitadores para nao ter "item" vazio
		    							
if(leitor.contains("ABENDED") || leitor.contains("FAILED") ||     
leitor.contains("NOT CATLGD 2") || leitor.contains("UNEXPLA")){   
		    			     
System.out.println(retornaListaNumerada(novoArq)); //ajuda a depurar as posições   
		    				              
if(novoArq[13].length() > 8 && novoArq[4].equals("170211")){    //verifica condição nos parâmetros certos   
		    				                   
StringBuilder linhaSaida  = new StringBuilder(); //stringbuilder é mais ágil para esses casos   
		    				                  
linhaSaida.append(novoArq[2]).append("  "); // DATA_PROCESSAMENTO         
linhaSaida.append(novoArq[3]).append("  "); // HORA     
linhaSaida.append(novoArq[4]).append("  "); // ODATE                       
linhaSaida.append(novoArq[13].substring(0,8)).append("  "); // JOB         
linhaSaida.append(novoArq[13].split("/")[1]).append("  "); // JOB_ID
		    				                    
if (leitor.contains("UNEXPLA")) { // OCORRENCIA   
linhaSaida.append(novoArq[16] + " " + novoArq[18]);   
		    				                    
} else if (leitor.contains("NOT CATLGD 2")) {   
linhaSaida.append(novoArq[15] + " " + novoArq[16] + " " + novoArq[17] + " " + novoArq[18] +
" " + novoArq[19]);    
		    				                    
}else if (leitor.contains("FAILED")){
linhaSaida.append(novoArq[15] + " " + novoArq[16] + " " + novoArq[17]);

}else if (leitor.contains("ABENDED")){
linhaSaida.append(novoArq[15] + " " + novoArq[17]);
}
		    				                
dadosArquivo.add(linhaSaida.toString()); //adiciono dado só aqui, para evitar linha vazia

Deu certinho, pegou todos os dados sem problemas, brigadão por esta ajuda…

Agora, se não for abusar do todo o seu auxilio e puder me ajudar em mais estas, te agradeço…

1º - Bom, como posso fazer para ler linha a linha o arquivo? pois realmente o processo será grande, pois o programa ira ler uma média de 5 arquivos por vez, pois as informações são separas em vários arquivos.

2º - Agora estou usando o meu código para buscar informações finalizadas OK, e o que eu precisaria seria somente linhas assim:

15 = ENDED, 16 = "OK"]

E não pegar linhas desta forma:

15 = ENDED, 16 = "OK", 17 = (DUMMY, 18 = JOB)]
15 = ENDED, 16 = "OK", 17 = ,, 18 = FORCED, 19 = OK]

como posso fazer isso ?

Desculpa todas estas minhas perguntas, e que você esta me salvando…eu não sou o experte em Java, mas pelo menos, tudo que você esta passando, estou agregando ao meu conhecimento.
valeu mais uma vez.

B

E outra coisa que esqueci de comentar…

Aquele seu método para mostrar todas as posições, show de bola!!!

L

1) Você lê linha a linha com BufferedReader.readLine(); padrão do java.

Algo como:
String[] arquivos = null; //nomes dos arquivos
		
		for (String arquivo : arquivos) {
			BufferedReader br = new BufferedReader(new FileReader(new File(arquivo)));
			for (String linha = br.readLine(); linha != null; linha = br.readLine()) {
				//trata linha
			}
			br.close();
		}
2) Você pode limitar pelo tamanho do array, por ex:
if (leitor.contains("UNEXPLA")) { // OCORRENCIA   
       if (novoArq.length > 17) { // não quero o que tem "lixo" depois do param 16
          continue; //continue vai ignorar o resto do loop e ir para o próximo
       } 
       linhaSaida.append(novoArq[10] + " " + novoArq[12]);   
 } else if (leitor.contains("NOT CATLGD 2")) {   
               //...                    
 }
L

brunosardao:

Aquele seu método para mostrar todas as posições, show de bola!!!

Tirei do “Arrays.toString()” padrão do Java 6, só adicionei os índices! Crédito para eles…

B

Show maninho…sem palavras novamente…

Pode ser crédito para eles pelo padrão, mas crédito para você também pela instrução mastigada…hehe!!

E para fecharmos de vez…

Veja se é complicado…

No arquivo que contém os erros, possui o campo JOB_ID, no arquivo de Finalizados OK também possui o ID.

Tanto um arquivo como o outro possuem o mesmo ID, pois no arquivo de erro, tem o horário incial do processo e no arquivo de OK o horário final.

O que eu preciso para acabar com este processo, é fazer o seguinte:

Comparar os ID´s dos dois arquivos para saber se os processos possuem os mesmos, se possuir, será impresso em um novo arquivo, a sequência:

DATA PROCESSAMENTO, HORA, HORAFINAL (pego do arquivo de finalizados OK) JOB, JOB_ID e OCORRENCIAS.

é muito complicado isso ?

Valeu mais uma vez!! :slight_smile:

L

Essa vou responder menos detalhada, só dar a idéia:

  • Cria um Map<String, String> que contém “job id” na chave, e o momento de execução como valor.
  • Parseia o arquivo que tem os valores de final de execução
  • Na hora de parsear o outro arquivo, você consulta esse mapa. Se existir, você usa. Se não, deixa em branco (ou coloca null mesmo).
B

Tá joia leo, já fez muito por mim…só tenho que lhe agradecer…

Vou terminar o processo de captura dos finalizados OK e depois vou tentar essa sua ideia…

ai, surgindo duvidas vou postando…!!

Mais uma vez, brigadão…

L

:thumbup:

Não esquece de colocar o “resolvido” no título do primeiro post!

B

Opa, pode deixar, coloco sim!!

abs,

B

Leo ou todos!!

Bom, estou procurando nos sites atrás deste MAP, pois nunca usei este parâmetro…porém está um pouco difícil…

eu sei que é fogo, mas será que dá para quebrar mais essa ai? dando uma clareada nas ideias…

valeu!!

L

java.util.Map.

Sugiro você dar uma lida na guia de Collections do Java, ou na documentação oficial, ou em alguma apostila!

B

Leo,

se possível, veja se isso é o caminho:

Map<String, ArrayList> mapa = new HashMap<String, ArrayList>();
mapa.put("JOB_ID", dadosArquivo.get(13).toString());

Eu poderia usar como chave, a posição do meu ArrayList ao invés dele ler do arquivo novamente ?

Pois, pensei aqui em ler direto da ArrayList o JOB_ID, para comparar com a outra ArrayList e assim dando certo, imprimir o novo arquivo já com as posições de hora inicial e hora final

[]´s

L

- assumindo que o arquivo de OK tem JOB_ID na posicao 0, status na posicao 1.

Map<String, String> status = new HashMap<String, String>();
for (String linha : linhasArquivo) {
   String[] partes = linha.split("\\s+");
   status.put(partes[0], partes[1]); //isso vai ter job_id -> ok ou não
}

//no segundo arquivo, assumindo que o JOB_ID está na coluna 3
for (String linha : linhasArquivo2) {
  String[] partes = linha.split("\\s+");
  String statusJobId = status.get(partes[3]);
  //continua processamento.
}
B

Leo.

O meu arquivo de OK esta assim:

180211  001237  180211  MCPSD663  82553  ENDED "OK"
180211  001249  180211  MCPSD665  82564  ENDED "OK"
180211  001301  180211  MCPSD670  82571  ENDED "OK"
180211  002414  180211  MCPSC363  84594  ENDED "OK"
180211  002426  180211  MCPSC365  84613  ENDED "OK"

E o meu arquivo de erro esta assim:

180211  072916  180211  YF1GOK7C  82131  COND 0004
180211  073116  180211  YKBGGIXA  82542  COND 0001
180211  074546  180211  LLBGD501  83709  COND 0008
180211  075407  180211  UYBGM608  84150  COND 0008
180211  075410  180211  UYBGM607  84212  COND 0008
180211  075910  180211  YF1GOK7C  84537  COND 0004

Então, no segundo FOR que você mencionou, ficaria como String statusJobId = status.get(partes[5]); ?

E no primeiro FOR, de acordo com o arquivo acima, seria: status.put(partes[5], partes[6]);

é isso ?

L

1o for: você popula a lista de OKs. se partes[5] tem o ID e o partes[6] tem o horário de finalização (que é o que você quer), está ok.

2o for: você consulta a lista de OKs. novamente, se partes[5] desse arquivo tem o mesmo ID do arquivo anterior, é isso aí.

B

Leo,

Então, depois que eu comparar os ID´s e ver que são iguais, tenho que pegar a coluna que tem o horário do arquivo de OK e jogar em um novo arquivo que ira conter todas as informações dos erros mais o horário do arquivo de OK ficando neste formato abaixo:

180211  072916  073015  180211  YF1GOK7C  82131  COND 0004
180211  073116  074017  180211  YKBGGIXA  82542  COND 0001
180211  074546  075015  180211  LLBGD501  83709  COND 0008
180211  075407  080015  180211  UYBGM608  84150  COND 0008
180211  075410  081510  180211  UYBGM607  84212  COND 0008
180211  075910  081020  180211  YF1GOK7C  84537  COND 0004
180211  080128  083015  180211  DRREPR75  85148  COND 0012

Pergunto-lhe novamente, pois não sei fazer isso, como consigo criar um novo arquivo com este formato acima?

tenho que jogar os dados em uma nova ArrayList igual fiz na captura do erros ? ou é de outra forma…

Se puder me ajudar em mais essa, te agradeço, estou muito enrolado e realmente não sei como fazer…

obrigado,

L
BufferedWriter bw = new BufferedWriter(new FileWriter(new File("out.txt")));
for (...) { //loop de processamento
  ...
  //tenho todos os campos a serem escritos
  for (int a1 = 0; a1 < campos.length; a1++) {
     bw.print(campo[a1]); bw.print(' ');
  }
  bw.println();
}

bw.flush();
bw.close();

Isso?

B

Isso mesmo, legal, mais uma vez obrigado…

bom, agora, vou tentar quebrar a cabeça para fazer o processo de comparação…

você já me deu o inicio e o final, vou tentar me virar, mesmo sendo um pouco complicado…

Mas brigadão mesmo leo, vc me deu uma força e tanto desde o início…

Abraços,

L

:thumbup:

B

Leo,

Seria mais ou menos isso ? ou to fazendo m…

Map<String, String> status = new HashMap<String, String>();   


for (String linha : dadosArquivo) {   
String [] partes = linha.split("\\s+");
status.put(partes[5], partes[2]);
}	

for (String linha : errosArquivo) {   
String[] partes = linha.split("\\s+");   
String statusJobId = status.get(partes[5]);   

StringBuffer arq = new StringBuffer();
	
if(statusJobId.equals(status)){

arq.append(partes[0]);
arq.append(partes[1]);
arq.append(partes[2]);
arq.append(status.get(dadosArquivo));
arq.append(partes[3]);
arq.append(partes[4]);
arq.append(partes[5]);
B

Leo,

Bom, seguinte, eu fiz o exemplo acima, não sei se está certo ou se é isso, porém não sai do lugar.

fiquei batendo cabeça, mas não consegui andar…acredito que já era de se esperar…

Será que vc se importaria mais uma vez, de me ajudar nessa ultima parte ?

é só essa comparação que esta faltando para eu finalizar.

dá mais esta força ai?? é possível ??

vlw…

B

Alguém poderia dar uma força ai na minha dúvida ?

L

Dicas daonde pode estar errado.

Map<String, String> status = new HashMap<String, String>();   


for (String linha : dadosArquivo) {   
String [] partes = linha.split("\\s+");
status.put(partes[5], partes[2]); //certo
}	

for (String linha : errosArquivo) {   
String[] partes = linha.split("\\s+");   
String statusJobId = status.get(partes[5]);  //certo

StringBuffer arq = new StringBuffer();
	
if(statusJobId.equals(status)){ //errado, talvez desnecessário

arq.append(partes[0]);
arq.append(partes[1]);
arq.append(partes[2]);
arq.append(status.get(dadosArquivo)); //errado, seria statusJobId?
arq.append(partes[3]);
arq.append(partes[4]);
arq.append(partes[5]);
B

Seria isso:

Map<String, String> status = new HashMap<String, String>();     
	    						  
	    						  
	    						for (String linha : dadosArquivo) {     
	    						String [] partes = linha.split("\\s+");   
	    						status.put(partes[5], partes[2]); //certo   
	    						}     
	    						  
	    						for (String linha : errosArquivo) {     
	    						String[] partes = linha.split("\\s+");     
	    						String statusJobId = status.get(partes[5]);  //certo   
	    						  
	    						  
	    						StringBuffer arq = new StringBuffer();   

	    						arq.append(partes[0]);   
	    						arq.append(partes[1]);   
	    						arq.append(partes[2]);   
	    						arq.append(status.get(statusJobId));   
	    						arq.append(partes[3]);   
	    						arq.append(partes[4]);   
	    						arq.append(partes[5]);  
	    						
	    						
	    						BufferedWriter bw = new BufferedWriter(new FileWriter(new File("C://Projeto_Log//out.txt")));  
	    						
	    						for(int j = 0; j < arq.length(); j++){
	    							
	    							bw.write(arq.length()); bw.write(" ");
	    							
	    						}
L
arq.append(statusJobId);
B

legal…

e a finalizaçao para a gravaçao dos dados esta correta ?

pois tentei fazer igual voce tinha me mostrado bw.print(arq[0]) ; bw.write(" ");

e deu problema, ele nao localiza o método print.

L

Eu confundi o writer com o printer…

Tenta usar o PrintWriter ao invés de usar BufferedWriter (só trocar as classes) e usa daí os print() e println() para mudar de linha.

B

Legal Leo…

Mais uma vez obrigado e desculpa encher o saco…

[]´s

B

Leo,

cara, to tendo mais um problema, ta voltando apenas valor NULL no horário do campo dos arquivo de OK.

tá ficando desta forma:

180211  072916  null  180211  YF1GOK7C  82131  COND  0004
180211  073116  null  180211  YKBGGIXA  82542  COND  0001
180211  074546  null  180211  LLBGD501  83709  COND  0008
180211  075407  null  180211  UYBGM608  84150  COND  0008
180211  075410  null  180211  UYBGM607  84212  COND  0008
180211  075910  null  180211  YF1GOK7C  84537  COND  0004
180211  080128  null  180211  DRREPR75  85148  COND  0012

Deixei o código desta forma:

Map<String, String> status = new HashMap<String, String>();     
	    						  
	    						  
	    						for (String linha : dadosArquivo) {     
	    						String [] partes = linha.split("\\s+");   
	    						status.put(partes[5], partes[1]); //certo   
	    						}     
	    						  
	    						for (String linha : errosArquivo) {     
	    						String[] partes = linha.split("\\s+");     
	    						String statusJobId = status.get(partes[5]);  //certo   
	    						  
	    						
	    						StringBuffer arq = new StringBuffer();   
					
	    						arq.append(partes[0] + "  ");   
	    						arq.append(partes[1] + "  ");
	    						arq.append(statusJobId + "  ");
	    						arq.append(partes[2] + "  ");   
	    						arq.append(partes[3] + "  ");   
	    						arq.append(partes[4] + "  ");   
	    						arq.append(partes[5] + "  " + partes[6]); 
	    						//arq.append(partes[7]);
	    						
	    						finalizado.add(arq.toString());
	    						
	    						}
	    						
	    						PrintWriter bw = new PrintWriter(new File("C://Projeto_Log//out.txt"));  
	    						
	    						for(String dados : finalizado){
	    								bw.println(dados); 
	    							
	    						}

usei um novo ArrayList. vc acha que tem necessidade ou não era necessário ??

valeu!!

L

O que você está usando como “índice” está errado. Verifica as posições que estão sendo usadas, e que realmente tem um campo repetido entre um arquivo e outro. Na parte do arquivo que você colou uma vez, não tinha nenhum número repetido.

B

então, no caso, o NULL é apresentando por que não há nenhum campo JOB ID igual certo ?

o erro do “Indice” que você diz, é quando separo as informações em colunas pelo arq.append ?

e uma dúvida, nos dois FOR que você criou para mim, pelo que pude entender, o segundo consulta o primeiro para ver se existe JOB_ID igual certo ?

L
  1. Sim.
  2. Indice da coluna. Você pode estar pegando uma coluna errada.
  3. Sim.
B

e no caso Leo, o comando: status.put(partes[5], partes[2]);

o primeiro parâmetro e a “chave” que seria a coluna JOB_ID, e o segundo parâmetro é o “valor” que é a coluna dos horários certo ?

L

Sim. Map.put(Chave, Valor).

B

Leo,

como sempre, vc estava certo em duas coisas: não existia mesmo ID igual e as posições estavam erradas.

tive que comparar com nome do JOB mesmo para pegar os horários, não teve jeito. Isso tá legal já funcionou.

Agora, tenho mais duas duvidas:

o meu arquivo agora esta assim:

260511  071630  071748  260511  PZTABELA  11533  COND
260511  071837  null  260511  HGACERTO  11637  COND

pega se tiver o horário se não coloca NULL, eu posso colocar um IF na opção arq.append(statusJobId + " "); para caso seja null, ao invés de adicionar NULL adicionar 4 espaços ?

e como consigo remover duplicidade ?

brigadão…

L

Método “complexo”: arq.append(statusJobId == null ? " " : statusJobId);

Método “simples”: if (statusJobId == null) statusJobId = " "; arq.append(statusJobId);

B

Legal Leo, funcionou…

Agora só mais duas coisas:

Usando o “Collection.Sort”, eu consigo ordenar o meu arquivo pela coluna de ocorrências ?

E como posso remover possíveis duplicidades que existam no arquivo ?

Obrigado,

L

brunosardao:
Legal Leo, funcionou…

Agora só mais duas coisas:

Duvido… :slight_smile:

Se todo mundo estiver numa Lista, daria.

Usa um SortedSet<List> para ser seu “arquivo”. Passa no construtor do TreeSet um comparador que faz a ordenação. Se já tiver igual, ele ou não adiciona, ou adiciona o novo (veja na documentação). Com isso, mata os 2 de uma vez.

B

beleza Leo, vou ler isso depois, mas isso não é prioridade agora, o mais importante é que a coleta dos dados, a separação e a junção dos horários tá funcionando direitinho…:slight_smile:

Mais uma vez, muito Obrigado por todo o auxilio…!!

realmente você me ajudou pra caramba!!

Abs,

Criado 20 de maio de 2011
Ultima resposta 27 de mai. de 2011
Respostas 49
Participantes 2