Capturar várias informações de vários arquivos txt e adicionar em arquivo CSV - Java

Olá Pessoal,
Gostaria de um suporte sobre como capturar algumas informações de vários arquivos txt (*.log).
Segue abaixo o formato do arquivo TXT:

Date Logged:        10-22-2014 11:11:00 AM
Task Name:      PROJECT_X_X00_SPI3
User ID:        Operator Mode
System:         PP/PS Series FlashCORE
Machine ID:     12345678910

Device:         MACRONIX MX25L6473EM2 SO8
Data Source:        X:\XPTO\PROJECT\BINARYFILE.bin
Sumcheck:       12345678
Process:        Continuity/Blank Check/ID Check/Erase/Program/Verify/Auto Secure/Mark/Vision
Process Status:     Job Begin Status: New Job, Job End Status: Stopped
TLWin Session ID:   < none >

Job Start Time:     10-22-2014 03:38:57 AM
Job End Time:       10-22-2014 11:11:00 AM
Devices Total:      5051
Devices Passed:     5041
Devices Failed:     10
Overall Device Yield:   99.80%

Task Description:   MX25L6473EM

Nominal Throughput: 722 dph
Job Throughput:     679 dph

O meu objetivo é conseguir capturar as informações dentro de cada arquivo e colocar em um arquivo CSV, onde o nome das colunas serão fixas e o contúdo de cada nome irá ser capturado de cada arquivo.

Exemplo de como deverá ficar:


Cada linha é representada por um arquivo *.log.

Segue abaixo o código que comecei a escrever. Consegui fazer um looping para ler todo o conteúdo de cada arquivo dentro de uma pasta, mas ao utilizar line.contains() só consigo pegar uma informação.

public class ReadingDataTxt {

	public static void main(String[] args) {

		String dir = "F:\\XPTO";

		File file = new File(dir);

		for (String arq : file.list()) {
			if (arq.endsWith(".log")) {
				System.out.println("--------->" + arq + "<---------");
				try {
					System.out.println(reading(dir + "\\" + arq));
				} catch (Exception e) {

				}
			}
		}
	}

	private static String reading(String dir) throws Exception {
		String line = " ", content = " ";
		BufferedReader br = new BufferedReader(new FileReader(new File(dir)));
		while ((line = br.readLine()) != null) {
			if (!line.isEmpty() && (line.contains("Date Logged:") && line.contains("Device:"))) {
				content = new StringBuilder(content).append(line.concat("\n")).substring(15, 25).toString();
				
			}
		}

		br.close();
		return content;
	}

}

Como sou novato na linguagem, agradeço pela ajuda!

Sugestão: troque o BufferedReader por Scanner (sim, o famoso java.io.Scanner que se usa no começo do aprendizado java).
Assim você lê linha a linha com o nextLine(). compara o que foi lido com as palavras chave (os títulos das colunas) e, sendo o que quer, armazena em algum lugar. Não sendo, descarta.

1 curtida

drsmachado, obrigado pelo retorno!
Seria algo assim:

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class ReadingDataTxtScanner {

	public static void main(String[] args) {

		String dir = "F:\\XPTO";

		File file = new File(dir);

		for (String arq : file.list()) {
			if (arq.endsWith(".log")) {
				System.out.println("--------->" + arq + "<---------");
				try {
					System.out.println(reading(dir + "\\" + arq));
				} catch (Exception e) {

				}
			}
		}
	}

	private static String reading(String dir) {

		try {
			File file = new File(dir);
			Scanner scanner = new Scanner(file);

			while (scanner.hasNext()) {
				System.out.println(scanner.next());
			}
			scanner.close();

		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
		return dir;
	}
}

Nesta Linha você está procurando as strings “Data Logged:” e “Device:” na mesma linha, isso acontece por que usou operador de igualdade neste bloco de comando. Tente trocar por um operador “ou” (||). Observe também que com este código está pegando apenas 2 linhas do log, será necessário acrescentar os outros campos desejados.

Quaisquer dúvidas volte a postar, se houver alguma mensagem de erro poste também.

1 curtida

Olha só, eu sugeriria algo assim (ou adaptado disso):
`package lerarquivo;

import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Scanner;

public class ArquivoParaCsv {
private static final String DATE_LOGGED = “Date Logged:”;
private static final String TASK_NAME = “Task Name:”;
private static final String DEVICE = “Device:”;
private static final String DEVICES_TOTAL = “Devices total:”;

public static void main(String[] args) throws Exception {
	//Identifica e carrega o arquivo para a memória
	File arq = new File("c:\\temp\\arquivo.log");
	//Instancia o objeto de scanner
	Scanner sc = new Scanner(arq);
	//Armazenaremos aqui o que iremos colocar no csv
	StringBuffer conteudoParaCsv = new StringBuffer();
	//Lista para armazenar as linhas lidas
	List<String> linhas = new ArrayList<String>();
	//Iterando nas linhas do arquivo
	while(sc.hasNextLine()) {
		//Armazenando na lista
		linhas.add(sc.nextLine());
	}
	//Fecha o stream de leitura
	sc.close();
	
	//Iterando a lista para comparar o que queremos.
	Iterator<String> it = linhas.iterator();
	while(it.hasNext()) {
		String linha = it.next();
		String conteudo = extraiConteudoQueInteressa(linha);
		if(null != conteudo) {
			conteudoParaCsv.append(conteudo);
		}
	}
	//Ao invés de imprimir, grava (append) no csv
	System.out.println(conteudoParaCsv);
	
}

private static String extraiConteudoQueInteressa(String linha) {
	if(linha.startsWith(DATE_LOGGED)) {
		return linha.replace(DATE_LOGGED, "").trim() + ";";
	}
	
	if(linha.startsWith(TASK_NAME)) {
		return linha.replace(TASK_NAME, "").trim() + ";";
	}
	
	if(linha.startsWith(DEVICE)) {
		return linha.replace(DEVICE, "").trim() + ";";
	}
	
	if(linha.startsWith(DEVICES_TOTAL)) {
		return linha.replace(DEVICES_TOTAL, "").trim() + ";\n";
	}
	
	return null;
}

}
`

1 curtida

Fala drsmachado!
Obrigado por compartilhar uma solução.
Efetuei algumas alterações para capturar o dado absoluto que deverá conter dentro do arquivo final (Output: 10-22-2014;MX25L6473EM2;5051;5041;10;99.80%;679;) porém estou apanhando para conseguir ler todos os arquivos da pasta.
Pelo que verifiquei o Scanner() não consegue criar um array dos arquivos e ler linha por linha, para em seguida tratar as informações de acordo com as variáveis globais.

Consegui ler todos os arquivos da pasta, mas não o conteúdo com o trecho abaixo:

    String dir = "F:\\XPTO";

    		File file = new File(dir);

    		for (String arq : file.list()) {
    			if (arq.endsWith(".log")) {
    				System.out.println(arq);
    				
    			}
    		}

Um outro método que verifiquei foi utilizar o BufferedReader, mas não consegui adiciona-lo na lógica.
Alguma sugestão?

Desculpe por tantas perguntas, como sou newbie na linguagem acabo tomando um coro…kkkkkk

Mas você nem precisa criar este array de arquivos, basta ler um por um.
Particularmente, eu desmembraria tudo. Como assim?
Criaria uma classe com um método que apenas recebesse o arquivo, criasse o objeto de Scanner e retornasse as linhas lidas (aí pode ser um array de String ou uma List de String, tanto faz).
Isso tornaria a classe “principal” menos poluída e você teria, como trabalho, que criar um array de File, onde cada objeto de File representa um dos arquivos a serem lidos.

1 curtida