Leitor de CSV

Bom, fiz um leitor de CSV, porque exportar separando por vírgula é fácil, difícil e ler e por tudo no lugar.
Tava mais é testando, usei até umas opções mais avançadas do JTable, todo o código ta bagunçado e com comentários toscos mas pode ser útil pra alguém.
O único problema que encontrei é que o Split do java, da problemas quando acha campos em branco, tipo ", ", daí tive que colocar os campos em branco separados por hífen. Se alguém aperfeiçoar o “programinha”, me avisa :smiley: .

Obs. O arquivo que ele procura é o teste0.csv (o teste.csv é sem hífen) e o arquivo que ele cria é o dados_csv.txt.

O “split” pode separar seus campos direitinho, é questão de passar o parâmetro adequado.

class TesteStringSplit {

    private static void mostrar (String msg, String[] partes) {
        System.out.println ("--- " + msg + " ---");
        for (String parte : partes) {
            System.out.println ("[" + parte + "]");
        }
        System.out.println();
    }

    public static void main(String[] args) {
        String teste = "ab,,cde,\"efg\",hij,,";
        System.out.println("String original: [" + teste + "]");
        
        mostrar ("Default - omite os últimos campos vazios", teste.split (","));
        mostrar ("(-1) - não omite nenhum campo", teste.split (",", -1));
        mostrar ("(+2) - mostra apenas 2 campos", teste.split (",", 2));
    }
}

A idéia é boa… e se for para levar o projeto pra frente coloca isto no GoogleCode ou algum outro host de projetos…

Agora segue algumas sugestõeszinhas :smiley:

Ter a opção para abrir arquivos csv, e poder definir o caracter que separa os campos, pode ser virgula, ponto e virgula, tabs, etc…

Quanto ao problema do espaços ou dos campos em branco, lembre-se que o split é regular expression, portanto vc deve fazer o split("\,"), ou o outro caracter definido, e depois do split se for um campo em branco, sera um null então tem q se fazer um IF no FOR do split para verificar os que são nulls, tipo:

String[] xptos = "teste,a,,teste,a,teste,,,teste,".split("\\,"); for (int x = 0; x < xptos.length; x++) { if (xptos[x] == null) { continue; } System.out.println(xptos[x]); }

Também era interessante suportar sequencia de caracteres, por exemplo poder usar “<:>”…

E também uma maneira de filtrar os resultados, imagina que quero apenas gravar os dados do csv que tem o e-mail terminado com @gmail.com

E se parar pra pensar mais dá para fazer mil e uma coisas, mas acho que o pessoal ainda cai no vicio de usar o Excel ou o OpenOffice pra trabalhar os csvs e fazer filtragens…

Mas se tiver recursos a mais tanto para gravar como para ler, e suportar XMLs e talz…

Agora é ter criatividade e para pra pensar um pouco e inventar…

Que show. Sabia que aquele segundo parâmertro servia para alguma coisa ! Valeu!

Ho Du! :smiley: É que esse projeto é parte de outro maior. Depois te mando, mas já que falou, tive problemas para pegar dados do CSV do Gmail, ele aparece com caracteres estranhos, se alguém puder testar ai.

Obs. O problema do Split ta corrigido, valeu thingol.
Agora o arquivo que ele lê é o “texte.csv”
Para imprimir (criar o arquivos txt) va no menu Imprime / Imprime… Valeu!

bzy,
Dei uma olhada no seu projeto, tá legal viu…
Creio que o problema daqueles caracteres seja a codificação em questão, abri o csv do gmail no bloco de notas e salvei com codificação ANSI e ele deu um sinal de vida rs…
Pesquise sobre charsets, talvez seja o problema.
Desculpe não poder ajudar muito pois ainda nao tenho experiência com charset.

Exatamente, se tem problemas com os caracteres é isto q o ksi disse, tem q setar o charset quando faz o InputStream…

Alguns charsets:
UTF-8 - UTF-16LE - UTF-16 - UTF-16BE - US-ASCII

Então na hora de abrir o arquivo ou então fazer um frame de configurações gerais, poder dizer o charset q deve ser usado, o charset do Input e o do Output… para poder por charsets diferentes…

Exemplo do uso de charset:

String charset = "US-ASCII";
java.io.Reader reader = new java.io.InputStreamReader(
     new java.io.FileInputStream("arquivo.csv"),
     java.nio.charset.Charset.forName(charset)
);

Obrigado de novo. Irei corrigir o problema e posto aqui e quem sabe num futuro próximo eu não de uma aperfeiçoada nele para o pessoal não ter mais que usar o Excel ! :smiley:

Obs. Gostei do seu gif ksi :smiley:

Eduveks
Eu até tentei fazer alguma coisa do tipo após pesquisar na internet sobre mudança de charset, acho que fiz algo do tipo na hora de salvar a String:

vetorDeStrings[i] = new String(outraString.getBytes(),"US-ASCII")

Mas não obtive bons resultados.

bzy
Assim que tiver uma versão mais aprimorada poste aí, pelo menos eu vou querer!
Sobre o gif fique a vontade se quiser colocar na sua assinatura tbm.
Até.

Que bom que alguém se interessou! :smiley: Eu corrigi uma parte, mas terei que reformular o programa se for colocar o Filechooser e permitir alterar o nome do arquivo que vai ser salvo. Fora corrigir alguns Bugs, então vai demorar um pouco masi do que eu pensava, mas vou colocar a última versão, só vai funcionar se escolher um arquivo logo que abrir a aplicação.
Testando mais a fundo percebi que embora tenha arruma o charset para ele lêr o CSV do Gmail, os outros ele não lê… Então, preciso ver isso também.

Lembrando que o código fonta está junto com o JAR.