[RESOLVIDO]Ajuda com separação de palavras com split

7 respostas
danilovazb

Olá, tudo bem jovens? =D

Eu estou tendo dificuldades em ler um arquivo com caracteres "|" e separar as palavras por ele, é um arquivo que vem do bando itau aqui para a empresa, eu preciso criar um programa que leia o arquivo .csv e separe os campos por |, jogue em uma JTable para poder tratar os dados.

O que fiz até agora foi ler o arquivo, mas quando vou tratar com o split ele me traz apenas a primeira letra, não entendi o porque.

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.io.IOException;


public class tratArquivo extends JFrame {

	private JPanel contentPane;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					tratArquivo frame = new tratArquivo();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public tratArquivo() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 145, 104);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		JButton btnNewButton = new JButton("Ação");
		btnNewButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				
				tratPipe trat = new tratPipe();
				try {
					trat.tratamentoArquivo();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
			}
		});
		btnNewButton.setBounds(20, 21, 89, 23);
		contentPane.add(btnNewButton);
	}
}
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;


public class tratPipe {

	public void tratamentoArquivo() throws IOException {
		
		FileReader ler = new FileReader("C:\\Users\\danilo\\Desktop\\11042013_11_3986.csv");
		BufferedReader leitor = new BufferedReader(ler);
		String linha;
		String linhaReescrita;
		
		PrintWriter out = new PrintWriter("TESTE.txt");
		
		while ((linha = leitor.readLine()) != null) {

			linhaReescrita = linha.replaceAll("|", ",");
			String[] linhas = linhaReescrita.split(",");
			//linhaReescrita = linha.replaceAll(";00", ";");
			out.println(linhas[1]);

		}

		out.close();
		leitor.close();
		
	}

}

:D

7 Respostas

E

Troque as duas linhas

linhaReescrita = linha.replaceAll("|", ",");  
            String[] linhas = linhaReescrita.split(",");

por esta única linha:

String[] linhas = linha.split (Pattern.quote ("|"));
danilovazb

Obrigado, funcionou aqui!!

Mas outra dúvida, poderia me explicar o que o Pattern faz??

O acesso aqui é limitado para pesquisa, só tenho o GUJ e fiquei curioso para saber…apenas inserir o código não é legal =D

Vlw mesmo, obrigadão!!! :smiley:

ViniGodoy

O método Pattern.quote irá criar a expressão regular necessária para que | seja interpretado como o caractere | e não como o simbolo de OU.

Já a classe Pattern representa uma expressão regular compilada mas, no caso, você não está pré-compilando sua Regex.

ViniGodoy

Só uma coisa: A sua solução também não funcionou porque o replaceAll também trabalha com expressões regulares. Se você tivesse usado o método replace, que substitui palavras e não expressões, provavelmente seu código teria funcionado - embora a solução do entanglement seja bem mais elegante, por dispensar o replace totalmente.

E

Você tem acesso à API do Java, pelo menos?

http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html#quote(java.lang.String)

De qualquer maneira, a ideia é a seguinte: String.split requer uma expressão regular.
Infelizmente, “|” é um operador para expressões regulares e quer dizer “alternativa”.
Como você quer encontrar o “|” mesmo, não uma expressão regular que tenha esse operador, então você usa o comando Pattern.quote, que transforma algo que é uma expressão regular em uma string que não é uma expressão regular.

Assim você “acalma” o split e faz ele funcionar do jeito que você quer.

danilovazb

entanglement Não tenho acesso, apenas ao site GUJ e ao JAVAFREE que por muita luta consegui liberar aqui rsrsrsrs

Não trabalho com desenvolvimento, sou entusiasta de java, e estou programando para facilitar um trabalho manual que eu e minha equipe teria hahahahaha

ViniGodoy, obrigado pela explicação, fico muito grato com vocês =D

Vou dar uma estudada quando chegar em casa sobre isso…

Muito grato, eu estava quebrando a cabeça aqui desde quinta passada hahahaha

E

Hum… podia pôr na sua fila de liberação *.oracle.com, *.ibm.com, *.eclipse.org, *.netbeans.org :slight_smile:

Criado 15 de abril de 2013
Ultima resposta 15 de abr. de 2013
Respostas 7
Participantes 3