1
resposta

Usar vírgula como delimitador com Locale pt_BR?

Dado o arquivo contas.csv abaixo:

CC,12345,224488,Fulano da Silva,2000,00
CC,45678,336699,Beltrano da Costa,3000,58
CP,12345,113355,Cicrano Lima,60000,77

e o código do main:

public static void main(String[] args) {
        try {
            Scanner scanner = new Scanner(new File("contas.csv"));
            String linha = "";
            Locale localeBr = new Locale("pt", "BR");

            while(scanner.hasNextLine()) {
                linha = scanner.nextLine();

                Scanner linhaScanner = new Scanner(linha);
                linhaScanner.useLocale(localeBr);
                linhaScanner.useDelimiter(",");

                String tipoConta = linhaScanner.next();
                int agencia = linhaScanner.nextInt();
                int numero = linhaScanner.nextInt();
                String titular = linhaScanner.next();
                double saldo = linhaScanner.nextDouble();

                System.out.format(localeBr, "%2s | %05d | %08d | %s | %,.2f %n", tipoConta, agencia, numero, titular, saldo);

                linhaScanner.close();                
            }            
            scanner.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

Ao utilizar o Locale pt_BR para o Scanner juntamente com o delimitador "," o código de leitura do contas.csv deixa de ler todos os elementos do arquivo.

Isto acontece porque a parte decimal do saldo no csv também é representado por vírgula e, por isso, o código proposto na aula entende como se fosse um novo elemento.

Segue saída:

CC | 12345 | 00224488 | Fulano da Silva | 2.000,00
CC | 45678 | 00336699 | Beltrano da Costa | 3.000,00    // sem a parte decimal
CP | 12345 | 00113355 | Cicrano Lima | 60.000,00    // sem a parte decimal

A melhor opção neste caso seria alterar o delimitador do arquivo contas.csv para algo como ";" ?

E outra, como funciona o linhaScanner.next() quando existe um caractere (no texto que será lido do contas.csv) igual ao delimitador definido? Existe alguma outra solução utilizada? Porque ao que tudo indica, ocorrerá o mesmo problema.

1 resposta

Com a String linha , tenta utilizar o StringTokenizar

https://www.baeldung.com/java-stringtokenizer