Ler Arquivo Texto e Criar Novos Arquivos a Partir do Arquivo Lido

Pessoal, estou precisando de uma ajuda para fazer o seguinte:

Eu tenho um arquivo texto (.txt), com as seguintes caracteristicas:

012005|abcdefghijklmn
012005|abcdefghijklmn
012005|abcdefghijklmn
022005|abcdefghijklmn
022005|abcdefghijklmn
032005|abcdefghijklmn

Na primeira coluna, até o separador “|” representa o mês e o ano. Eu preciso ler esse arquivo texto, e depois salvar mês a mês o conteudo que tem depois do separador.
Gostaria de um auxílio para ver como eu poderia fazer isso.

no exemplo acima, eu teria que gerar os seguintes arquivos:

Arquivo 012005.txt
abcdefghijklmn
abcdefghijklmn
abcdefghijklmn

Arquivo 022005.txt
abcdefghijklmn
abcdefghijklmn

Arquivo 032005.txt
abcdefghijklmn

Preciso salvar os arquivos com os registros de cada mês individualmente ja incluindo o mes/ano no nome do arquivo.

Agradeço pela ajuda de todos.

Segue uma das maneiras de fazer isso que você precisa:

[code]public static void main(String[] args) {

	String linha = "";
	String data = "";
	String ultimaData = "";
	String texto = "";

	// Lendo do arquivo
	
	File arquivoEntrada = new File("Texto.txt");
	File arquivoSaida;
	BufferedWriter saida = null;

	try {
		BufferedReader entrada = new BufferedReader(new FileReader(arquivoEntrada));
		while ((linha = entrada.readLine()) != null) {

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

			// 2 tokens, o que vem antes e o que vem depois do |
			if (token.countTokens() != 2) {
				System.err.println("Erro, linha contém mais de 1 caracter separador |, linha foi ignorada!");
                                    continue; // Vai para próxima linha
			} 
			// Data
			data = (String) token.nextElement();
			
			// Se mudou a data, cria arquivo
			if(!data.equalsIgnoreCase(ultimaData)) {
				// Fecha o anterior, se estiver aberto
				if(saida != null) {
					saida.close();
				}
				
				arquivoSaida = new File(data+".txt");
				saida = new BufferedWriter(new FileWriter(arquivoSaida));
                                    // assim ele cria arquivo novo sempre, se quiser que faça 'append'  
                                    // substitua FileWriter(arquivoSaida) por FileWriter(arquivoSaida,true) (Será necessário caso o arquivo txt esteja fora de ordem de data)
				
				ultimaData = data;
			}
			
			// Le o 2o token
			texto = (String) token.nextElement();
			
			if(texto!=null && saida != null ) {
				saida.write(texto);
				saida.newLine();
			}
		}
		// Se ficou algum arquivo de saída aberto, fecha.
		if(saida != null) {
			saida.close();
		}
	} catch (Exception e) {
		e.printStackTrace();
	}

}
[/code]

Caro “jamirdeajr”, genial esse seu código, era isso mesmo que eu estava precisando.

Se não for abusar da sua gentiileza, gostaria de um auxílio para implementar uma forma do usuário selecionar o arquivo em um diretório e também selecionar onde os novos arquivos serão salvos.

Me desculpem pelas minhas perguntas um tanto quanto básicas, é que sou iniciante em JAVA e o meu conhecimento é bem básico.

Muito obrigado e fico muito feliz com a ajuda recebida neste post. Com certeza um dia também terei condições de ajudar aos amigos.

racechet, dá uma pesquisada em FileChooser, aqui mesmo no GUJ tem exemplos.
Neste link tem a documentação sobre ele, e tem exemplos também:
http://download.oracle.com/javase/6/docs/api/javax/swing/JFileChooser.html

Poderíamos até fazer o código pra você, mas seria bom que você tentasse dar uma lida nos exemplos, tentar entender como funciona. No começo sempre parece complicado, mas é uma boa maneira de ir se habituando a ler códigos e aprendendo, blz?

Blz jamirdeajr, vou estudar essa classe e depois volto para contar os resultados.

Muito obrigado pelas dicas.

Caro jamirdeajr, implementei a classe FileChooser para selecionar o arquivo e também para pegar o diretório onde os novos arquivos serão gravados.
Qunato a selecionar o arquivo, esta funcionando perfeitamante.

Em relação ao diretório de saida, ocorre o seguinte, quando eu seleciono uma pasta ou subpasta, ao invés de salvar na pasta selecionada, ele sempre salva no diretório raiz, ou seja, no c:, d:, etc…

Vou postar o código abaixo, se possível, gostaria de um auxílio com esse probleminha.

[code]import javax.swing.JFileChooser;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.StringTokenizer;

public class GeraTexto {

public static void main(String[] args) {

String linha = "";
String data = "";
String ultimaData = "";
String texto = "";
    String dirSaida = "";

    // Lendo do arquivo

   JFileChooser chooserE = new JFileChooser();
    chooserE.setFileSelectionMode(JFileChooser.FILES_ONLY);
    chooserE.setMultiSelectionEnabled(false);
    if (chooserE.showOpenDialog(null) != JFileChooser.APPROVE_OPTION)
      return;
File arquivoEntrada = chooserE.getSelectedFile();


    // Diretorio saida
    JFileChooser chooserS = new JFileChooser();
    chooserS.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
    chooserS.setMultiSelectionEnabled(false);
    if (chooserS.showOpenDialog(null) != JFileChooser.APPROVE_OPTION)
      return;
    dirSaida = chooserS.getCurrentDirectory().getPath();

File arquivoSaida;
BufferedWriter saida = null;

	try {
		BufferedReader entrada = new BufferedReader(new FileReader(arquivoEntrada));
		while ((linha = entrada.readLine()) != null) {

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

			// 2 tokens, o que vem antes e o que vem depois do |
			if (token.countTokens() != 2) {
				System.err.println("Erro, linha contém mais de 1 caracter separador |, linha foi ignorada!");
                                    continue; // Vai para próxima linha
			}
			// Data
			data = (String) token.nextElement();

			// Se mudou a data, cria arquivo
			if(!data.equalsIgnoreCase(ultimaData)) {
				// Fecha o anterior, se estiver aberto
				if(saida != null) {
					saida.close();
				}

				arquivoSaida = new File(dirSaida+data+".txt");
				saida = new BufferedWriter(new FileWriter(arquivoSaida));
                                    // assim ele cria arquivo novo sempre, se quiser que faça 'append'
                                    // substitua FileWriter(arquivoSaida) por FileWriter(arquivoSaida,true) (Será necessário caso o arquivo txt esteja fora de ordem de data)

				ultimaData = data;
			}

			// Le o 2o token
			texto = (String) token.nextElement();

			if(texto!=null && saida != null ) {
				saida.write(texto);
				saida.newLine();
			}
		}
		// Se ficou algum arquivo de saída aberto, fecha.
		if(saida != null) {
			saida.close();
		}
	} catch (Exception e) {
		e.printStackTrace();
	}

}

}[/code]

Blz cara, ficou bem legal.

Então, parece que faltou só o separador entre a pasta e o arquivo. Use o File.separator que já adapta de acordo com o sistema operacional:

arquivoSaida = new File(dirSaida+ File.separator + data + ".txt");

Deve funcionar!

Adicionei o File.separator conforme sua orintação, porém, continua salvando direto no diretorio raiz onde selecionei a pasta de destino.

Que estranho, até fiz um teste com seu código e funcionou, gravando em qualquer subdiretório.
Verifique que valor tem ‘dirSaida’ rodando em debug ou então fazendo um print no console:

System.out.println("dirSaida="+dirSaida); System.out.println("Arquivo="+dirSaida+ File.separator + data + ".txt");

Fiz o que você me passou e olha só o resultado.

Criei um diretório chamado Teste no d: e o resultado foi esse:

dirSaida=D:
Arquivo=D:\072007.txt

Criei um diretório Teste2 dentro do Teste e dai o resultado foi o seguinte:

Arquivo=D:\Teste\042007.txt
dirSaida=D:\Teste

A conclusão é que ele reconhece sempre o diretório anterior ao ultimo seleecionado.

Isso poderia ter alguma relação em função de eu estar utilizando o windows 7 64bits?

Notei duas coisas, no teste que eu fiz selecionava pasta existente, então ele alterava o diretório atual para este. Já quando cria novo ele não faz isso:
Então, troque:

dirSaida = chooserS.getCurrentDirectory().getPath();  

Por

dirSaida = chooserS.getSelectedFile().getPath();

A outra é que quando seleciona a pasta Raiz ele inclui o separador, então neste caso devemos trocar isso:

arquivoSaida = new File(dirSaida + File.separator + data + ".txt");

por

if(dirSaida.endsWith(File.separator)) arquivoSaida = new File(dirSaida + data + ".txt"); else arquivoSaida = new File(dirSaida + File.separator + data + ".txt");

Boa noite jamirdeajr,

Implementei as soluções que você me passou e funcionou perfeitamente.

Muito obrigado pelo auxílio.