Reposicionamento de arquivo

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.

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

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 ;

Olá,

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

[]s

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 ; ?

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

[code] 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();
  }[/code]

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

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

[code]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();

}

}
[/code]
e possivel

melhor onde implemento a variavel

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

dentro do meu codigo ?

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

Segue o codigo desenvolvido e alterado irei testar depois . Valeu

[code]
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();
}[/code]

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.