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

6 respostas
programaçãojava
W

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:     [telefone removido]

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!

6 Respostas

D

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.

W

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;
	}
}
R

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.

D

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

}
`

W

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

D

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.

Criado 14 de fevereiro de 2017
Ultima resposta 20 de fev. de 2017
Respostas 6
Participantes 3