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

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.

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

}

[/code]

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

}
[/code]

:smiley:

Troque as duas linhas

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

por esta única linha:

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

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:

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.

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.

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.

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

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