Reposicionamento de arquivo

10 respostas
L

Boa Tarde

E possivel transformar uma arquivo posicional em sequencial exemplo:

Arquivo horiginal

$DJDE$ FORMS=SHT001,FEED=TWO2,FORMAT=SVT01L,DUPLEX=NO,END;
PAG.: 01
ETQ.: 1
21 - PARANAGUA 3
0120 - ANTONINA 3
00014 - MOYSES LUPION, C E - E FUND 3

0120 - ANTONINA 3

Novo Arquivo
SHT001TWO2D6; PAG.:01;ETQ.:1; 21;PARANAGUA;0120;ANTONINA;00014;MOYSES LUPION, C E - E FUND;0120;ANTONINA

O que eu consegui ate o momento e ler o arquivo e gerar um novo ja e um começo segue o codigo:

import java.io.*;

public class ProcessadorTexto
{

// java ProcessadorTexto arquivo.txt novoArquivo.txt

public static void main (String [] args) throws Exception{

if(args.length != 2){   
  System.out.println("uso: java ProcessamentoTexto arquivo.txt novoArquivo.txt");   
  System.exit(1);   
}   

FileInputStream stream = new FileInputStream(args[0]);   
InputStreamReader streamReader = new InputStreamReader(stream);   
BufferedReader reader = new BufferedReader(streamReader);   

FileWriter fileWriter = new FileWriter(args[1]);   
PrintWriter writer = new PrintWriter(fileWriter);
// Neste while lemos o arquivo linha a linha

String line = null;

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

}

writer.close();

fileWriter.close();

reader.close();

streamReader.close();

stream.close();

}

}

Se perguntarem não e trabalho de Facul e arquivos mainframe indo para Plataforma Baixa sendo Tranformados de posicionais para Seguenciais.

10 Respostas

mario.fts

tipo, não entendi muito seu problema, pelo q pude perceber vc só tirou uma parte do cabeçalho do arquivo, de resto vc escreveu ele inteiro em uma linha, substituindo alguns caracteres por delimitadores ";".

Seria isso? poderia explicar melhor qual o problema?

a sim, sempre q for postar trechos de código, coloque ele entre as tags [code].

[]'s

L

Veja o arquivo em anexo se tiver um editor Exa tipo Scite melhor,

1 o arquivo chega neste formato eu irei pegar a informação apos o Forms e todo o restante do arquivo ate o proximo DJDE eu monto a cada FORMS = X todos os arquivos subseguentes em ; quando achar o proximo Forms = X monta novamente junta toda a pagina separando em ;

eberson_oliveira

Olá,

Não da pra usar expressões regulares?
Assim você poderia facilmente obter o conteúdo e montar conforme a sua necessidade.

[]s

L

eberson expressoes regulares e uma opção ja pensada tipo se for forms = x pegue todo mundo mais como eu junto linha a linha com ; ?

eberson_oliveira

De acordo com o que você disse... montei uma pequena rotina que pode te ser útil

String regex = "\\$DJDE\\$ FORMS=";
      
      try {
         FileInputStream stream = new FileInputStream( new File( "C:\\Original01" ) );
         
         InputStreamReader streamReader = new InputStreamReader( stream );
         
         BufferedReader reader = new BufferedReader( streamReader ); 
                  
         String line = null;
         Pattern pattern = Pattern.compile( regex );
         Matcher matcher = null;
         
         File file = new File( "C:\\testeSaida.txt" );
         
         file.createNewFile();
         
         FileWriter fileWriter = new FileWriter( file );
         BufferedWriter writer = new BufferedWriter( fileWriter  );
         boolean inicio = true;
         
         // Neste while lemos o arquivo linha a linha 
         while ( ( line = reader.readLine() ) != null ) {

            matcher = pattern.matcher( line );

            //se casou o conteúdo
            if ( matcher.find() ) {
               
               if ( !inicio ){
                  /*
                   * quando casar o conteúdo... o que houver antes do trecho casado
                   * pertence ao item anterior... 
                   */
                  writer.write( line.substring( 0, matcher.start() ) + ";" );
                  writer.newLine();
               }
               
               inicio = false;
               
               //o conteudo da linha.. após o trecho casado... pertence ao novo item
               writer.write( line.substring( matcher.end() ) );
               continue;
            }

            //se nao casou.. é pq a linha inteira pertence ao item corrente...
            writer.write( line );
         }
         
         
         writer.close(); 
         fileWriter.close(); 
         reader.close(); 
         streamReader.close(); 
         stream.close(); 
      }
      catch ( FileNotFoundException e ) {
         e.printStackTrace();
      }
      catch ( IOException e ) {
         e.printStackTrace();
      }

Assim ele vai colocar tudo o que estiver entre "$DJDE$ FORMS=" até encontrar a próxima ocorrência de "$DJDE$ FORMS=".. para ficar fácil de visualizar adicionei uma quebra de linha no final de cada item...

Acho que com isso você já consegue chegar a uma solução. Não esqueça de verificar algum ponto falho na rotina, por exemplo, não fiz nenhum tipo de tratamento para nada... só coloquei um código para gerar o que você precisava.

Como deve ficar o início do arquivo?

Assim

SHT001,FEED=TWO2,FORMAT=SVT01L,DUPLEX=NO,END;...

ou assim:

SHT001TWO2....

Não pude entender qual seria a saída correta.. me pareceu que suas duas explicações foram contraditórias... poderia deixar mais claro?

[]s

L

Eberson seria igual a 2 saida so que agruparia tudo ate proxima linha apos isto ele começa a gerar o ; ou , isto e indepentente tipo assim

SHT001TWO2jose,antonio,casa
SHT002NONEmARIA,JOAQUINA,RUA

Outra coisa onde eu implemento este codigo aqui

import java.io.*; 

public class ProcessadorTexto 
{ 

// java ProcessadorTexto arquivo.txt novoArquivo.txt 

public static void main (String [] args) throws Exception{ 

if(args.length != 2){ 
System.out.println("uso: java ProcessamentoTexto arquivo.txt novoArquivo.txt"); 
System.exit(1); 
} 

FileInputStream stream = new FileInputStream(args[0]); 
InputStreamReader streamReader = new InputStreamReader(stream); 
BufferedReader reader = new BufferedReader(streamReader); 

FileWriter fileWriter = new FileWriter(args[1]); 
PrintWriter writer = new PrintWriter(fileWriter); 
// Neste while lemos o arquivo linha a linha 
String line = null; 
while( (line=reader.readLine() ) != null ) { 
} 
writer.close(); 
fileWriter.close(); 
reader.close(); 
streamReader.close(); 
stream.close(); 

} 

}
e possivel
L

melhor onde implemento a variavel

String regex = "\\$DJDE\\$ FORMS=";   
  
try   {

dentro do meu codigo ?

eberson_oliveira

labavel,

da pra implementar isso no seu código sim… rs… eu copiei o seu código e escrevi por cima… faz assim: pega o código que te passei e cola sobre o seu código a partir da linha 15… ai troca as minhas strings dos Files para os parâmetros que você está recebendo… assim você deve obter o mesmo resultado que eu obtive aqui…

Para fazer isso funcionar você vai precisar definir alguns padrões (se isso for possível), por exemplo:

NOMEFORM FEED, NOME, ENDERECO

Nesse endereço você poderia armazenar… nome da rua, bairro, cep e talz… ou, caso todos sempre existam, definí-los separadamente… depois criar algumas expressões para “minerar” o seu arquivo e montar o resultado que você espera. Vai me desculpar, mas não vai dar pra eu ver isso agora… podemos ver isso depois… vai pensando e vendo se consegue chegar a algum lugar… qualquer coisa posta ai que não vai faltar pessoas interessadas em ajudar… assim que puder eu dou outra olhada pra ver o que você conseguiu…

[]s

L

Segue o codigo desenvolvido e alterado irei testar depois . Valeu

import java.io.*;   
  
public class ProcessadorTexto   
{   
  
// java ProcessadorTexto arquivo.txt novoArquivo.txt   
  
public static void main (String [] args) throws Exception{   
  
if(args.length != 2){   
System.out.println("uso: java ProcessamentoTexto arquivo.txt novoArquivo.txt");   
System.exit(1);   
}   
  
String regex = "\\$DJDE\\$ FORMS=";   
  
try {   
   FileInputStream stream = new FileInputStream( new File(args[0]) );   
     
   InputStreamReader streamReader = new InputStreamReader( stream );   
     
   BufferedReader reader = new BufferedReader( streamReader );   
               
   String line = null;   
   Pattern pattern = Pattern.compile( regex );   
   Matcher matcher = null;   
     
   File file = new File( args[1] );   
     
   file.createNewFile();   
     
   FileWriter fileWriter = new FileWriter( file );   
   BufferedWriter writer = new BufferedWriter( fileWriter  );   
   boolean inicio = true;   
     
   // Neste while lemos o arquivo linha a linha   
   while ( ( line = reader.readLine() ) != null ) {   
  
      matcher = pattern.matcher( line );   
  
      //se casou o conteúdo   
      if ( matcher.find() ) {   
           
         if ( !inicio ){   
            /*  
             * quando casar o conteúdo... o que houver antes do trecho casado  
             * pertence ao item anterior...  
             */   
            writer.write( line.substring( 0, matcher.start() ) + ";" );   
            writer.newLine();   
         }   
           
         inicio = false;   
           
         //o conteudo da linha.. após o trecho casado... pertence ao novo item   
         writer.write( line.substring( matcher.end() ) );   
         continue;   
      }   
  
      //se nao casou.. é pq a linha inteira pertence ao item corrente...   
      writer.write( line );   
   }   
     
     
   writer.close();   
   fileWriter.close();   
   reader.close();   
   streamReader.close();   
   stream.close();   
}   
catch ( FileNotFoundException e ) {   
   e.printStackTrace();   
}   
catch ( IOException e ) {   
   e.printStackTrace();   
}
L

O aplicativo acima esta atendendo as condições preestabelecidas quando o arquivo vier com um

"\\$DJDE\\$ FORMS=

porem a questão e quando for validar um caracter Hexa tipo

// não esta em hexa ainda tenho que ver o padrão
if String regex = "FFCR";
//ou
if String regex = "\\$DJDE\\$ FORMS=SHT002"

O programa se conporte de outra maneira ou seja formate ate o segundo hexa, tenho um hexa de caracter que quebra e depois o segunto. Se as condiçoes não atenderem a primeira condição va para a segunda preestabelecidas junta todos em uma linha.

Outra coisa em Perl eu acesso um arquivo no servidor e checo os padroes no java eu tambem e possivel fazer isto.

Criado 3 de março de 2010
Ultima resposta 4 de mar. de 2010
Respostas 10
Participantes 3