Dividindo String com split

Com essa função você pode passar um a lista de delimitadores da menor para maior prioridade e a string:

static public Vector<String> splitMultipleDelimiters(String str, char delimiters[]) {
        Vector<String> finalTokens = new Vector<String>();
        
        final char NATURAL_DELIMITER = delimiters[0];
        char delimiter = NATURAL_DELIMITER;
        String field = "";
        boolean unique = false;
        for (int i = 0; i < str.length(); i++) {
            int j;
            for (j = 1; j < delimiters.length; j++)
                if (str.charAt(i) == delimiters[j] && delimiter == NATURAL_DELIMITER) {
                    delimiter = delimiters[j];
                    break;
                }
            if (j < delimiters.length) continue;
            
            if (str.charAt(i) == delimiter) {
                if (!field.isEmpty())
                    finalTokens.add(field);
                field = "";
                delimiter = NATURAL_DELIMITER;
            }
            else
                field += str.charAt(i);
        }
        
        return finalTokens;
    }

Exemplo de uso:

        char delimiters[] = {',', '"'};
        Vector<String> list = splitMultipleDelimiters("1,*\"Joao, Silva\", 2, 3*,\"Maria\",45", delimiters);

Olá Evandro,

Se não for obrigado a usar o separador virgula “,” procure usar um caractér que seja pouco usado, por exemplo o “^” para ser o separador.

Nesse caso o método split não funciona da forma que funciona com o caracter “,”.
Mas é bem simples fazer o split entender que você quer usar o “^” como separador.
Tem que usar o Pattern.quote() para o split conhecer o “^”.

Segue modelo do código:

[code]

import java.util.regex.Pattern;

public class TesteCase {

public static void main(String[] args) {

	String[] colunas = { "Nome da Pessoa", "Endereço", "Bairro", "Telefone" };

	String registroDeAgenda = "Marivalda de Oliveira^Rua Jaraguá, número 10, casa 300^Centro^9999-9999";

	String campos[] = registroDeAgenda.split(Pattern.quote("^")); // É só usar o Pattern.quote.

	for (int i = 0; i < colunas.length; i++) {
		System.out.println(colunas[i] + ": " + campos[i]);
	}
}

}[/code]

Agora se for obrigado a usar a vírgula… vai ficar complicado.

Note que um CSV “de verdade” (tal como o que você passou) é mais fácil de ler que um CSV “padrão brasileiro” (separado por ";’ e com números com vírgulas).

package guj;

import java.io.IOException;
import java.io.StreamTokenizer;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;

public class ExemploStreamTokenizer {

    /**
     * Este exemplo mostra como ler uma linha de um arquivo CSV (padrão americano, ou seja, separado por vírgulas, e os
     * números são com pontos
     */
    public void exemplo1() throws IOException {
        String csv = "1, \"Rua dos Bobos, 0\", 1.234, \"Kafka escreveu \\\"A Metamorfose\\\", livro publicado em 1915, em 1912.\"";
        StreamTokenizer st = new StreamTokenizer(new StringReader(csv));
        st.parseNumbers(); // StreamTokenizer supõe que os números são em formato americano
        List<Object> campos = new ArrayList<Object>();
        for (int tokenType = st.nextToken(); tokenType != StreamTokenizer.TT_EOF; tokenType = st.nextToken()) {
            switch (tokenType) {
            case StreamTokenizer.TT_EOL:
                continue;
            case StreamTokenizer.TT_NUMBER: // números com ponto decimal e talvez em notação científica
                campos.add(st.nval);
                break;
            case StreamTokenizer.TT_WORD: // palavras soltas
                campos.add(st.sval);
                break;
            case '\"': // campos entre aspas
                campos.add(st.sval);
                break;
            case ',': // pulando os delimitadores
                break;
            default:
                campos.add(tokenType);
                break;
            }
        }
        System.out.println("Exemplo1: ");
        System.out.println("Entrada: " + csv);
        System.out.println("Analisado:");
        for (int i = 0; i < campos.size(); ++i) {
            System.out.printf("%d: %s\n", i + 1, campos.get(i));
        }
    }

    /**
     * Este exemplo mostra como ler uma linha de um arquivo CSV (padrão brasileiro, ou seja, separado por ";", e os
     * números são com vírgulas
     */
    public void exemplo2() throws IOException {
        String csv = "1; \"Rua dos Bobos, 0\"; 1,234; \"Este texto é disponibilizado nos termos da licença Creative Commons; pode estar sujeito a condições adicionais.\"";
        StreamTokenizer st = new StreamTokenizer(new StringReader(csv));
        st.resetSyntax();
        st.wordChars('A', 'Z');
        st.wordChars('a', 'z');
        st.whitespaceChars(0, ' ');
        st.quoteChar('\"');
        st.slashStarComments(true);
        st.slashSlashComments(true);

        // Note que StreamTokenizer supõe que os números têm pontos, não vírgulas.
        // Ou seja, temos de nós mesmos analisar os números :(
        List<Object> campos = new ArrayList<Object>();
        StringBuilder currentNumber = new StringBuilder();
        boolean prevTokenWasPartOfNumber = false;
        for (int tokenType = st.nextToken(); tokenType != StreamTokenizer.TT_EOF; tokenType = st.nextToken()) {
            switch (tokenType) {
            case StreamTokenizer.TT_EOL:
                if (prevTokenWasPartOfNumber && currentNumber.length() > 0) {
                    campos.add(currentNumber.toString());
                }
                break;
            case '0':
            case '1':
            case '2':
            case '3':
            case '4':
            case '5':
            case '6':
            case '7':
            case '8':
            case '9':
            case ',':
                currentNumber.append((char) tokenType);
                prevTokenWasPartOfNumber = true;
                break;
            case StreamTokenizer.TT_WORD: // palavras soltas
                if (prevTokenWasPartOfNumber && currentNumber.length() > 0) {
                    campos.add(currentNumber.toString());
                    currentNumber.setLength(0);
                    prevTokenWasPartOfNumber = false;
                }
                campos.add(st.sval);
                break;
            case '\"': // campos entre aspas
                if (prevTokenWasPartOfNumber && currentNumber.length() > 0) {
                    campos.add(currentNumber.toString());
                    currentNumber.setLength(0);
                    prevTokenWasPartOfNumber = false;
                }
                campos.add(st.sval);
                break;
            case ';': // pulando os pontos-e-vírgulas
                if (prevTokenWasPartOfNumber && currentNumber.length() > 0) {
                    campos.add(currentNumber.toString());
                    currentNumber.setLength(0);
                    prevTokenWasPartOfNumber = false;
                }
                break;
            default:
                if (prevTokenWasPartOfNumber && currentNumber.length() > 0) {
                    campos.add(currentNumber.toString());
                    currentNumber.setLength(0);
                    prevTokenWasPartOfNumber = false;
                }
                campos.add(tokenType);
                break;
            }
        }
        System.out.println();
        System.out.println("Exemplo2: ");
        System.out.println("Entrada: " + csv);
        System.out.println("Analisado:");
        for (int i = 0; i < campos.size(); ++i) {
            System.out.printf("%d: %s\n", i + 1, campos.get(i));
        }
    }

    /**
     * @param args
     */
    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
        ExemploStreamTokenizer est = new ExemploStreamTokenizer();
        est.exemplo1();
        est.exemplo2();
    }

}

Bom dia entanglement !

Eu estou finalizando um metodo que criei para suprir minha necessidade.
Ontem dei uma olhada no StreamTokenizer que vc me falou, mais não compreendi muito bem.
Você poderia me dar um exemplo de como eu poderia usar o StreamTokenizer?

Desde já agradeço a atenção.

Desconsiderem minha ultima resposta!!!

Falha minha … :oops:

Muito obrigado a todos, tanto pela atenção quanto pela rapidez!!!

Vou estudar todas possibilidades que vocês me apresentaram e aplicar no meu
projeto pra ver como fica.

Valeu galera!!!