Ler arquivo e carregar em um vetor Float

Preciso de uma ajuda, eu preciso realizar um código onde leia um arquivo txt que possua arquivos em float e carregue o mesmo em um vetor float para que posteriormente possa ordena-lo.

a minha dificuldade é, como abrir esse arquivo e coloca-lo em um vetor float?

Olá, @Pablo_Santos1! É possível postar o código que já fez? :grin:

   // cria o vetor
    Vector<Float> v = new Vector<Float>();
 
   // entrada de dados a partir do arquivo de texto
   // utilizei a leitura com BufferedReader
   // o loop preenche o vetor com os dados do arquivo
   // utilizo método valueOf para converter a string em inteiro
    String nomeArquivo = "text.csv";
    try {
      BufferedReader in = new BufferedReader(new FileReader(nomeArquivo));
      String linha = null;
      while ((linha = in.readLine()) != null) {
        try {
          v.add(Float.valueOf(linha));
        } catch (NumberFormatException e1) {
          // somente não insere
        }
      }
      in.close();
    }
    catch (IOException e) {
      System.out.println( "erro não tratado - somente indicação "); 
    }  

    System.out.println("Vetor não ordenado : \n" + v + "\n");

Havia feito assim, mas o arquivo é em CSV

1 curtida

Sua questão não ficou muito clara para mim, posso estar errada, mas vamos lá… Vou te dar uma sugestão:

Pelo que entendi, seu código já faz a leitura. O que precisa é trabalhar a conversão de tipos antes de colocar num vetor float ou Float. Eu nunca usei Vector, mas minha sugestão é:

  1. O arquivo é de texto, ou seja, são dados do tipo String.
  2. Sendo assim:
    2.1 Precisa ler o arquivo;
    2.2 Salvar em um vetor de String;
    2.3 E, caso haja algum separador(vírgula ou ponto-e-vírgula, por exemplo), utilizar isso para guardar os dados em cada posição do vetor, como se estivesse gerando novas colunas.
  3. Então, precisará converter esses dados de String para float ou Float para poder utilizados como dados decimais.
  4. Aí sim, ordenar.
1 curtida

E o principal, além da conversão que vc precisa fazer como @vanribeiro falou, é usar uma lista de float, evite usar Vector, ele é “pesado” para esse tipo de coisa e melhor usada com Threads (processamento paralelo), mas isso é assunto pra outro post… use listas:

List<Float> lista = new ArrayList<>(); //sim float maiusculo...

Já com relação ao separador, geralmente em csv é virgula e vc precisa “quebrar a linha” antes de converter cada “coluna” usando split:

...
String[] colunas = linha.split(",");
for (String item : colunas) { //forEach java
    lista.add(Float.valueOf(item));
}

Isso se todas as colunas forem float para serem convertidos e adicionados à lista, se vc tem uma coluna especifica, precisa acessar diretamente a posição sem usar esse forEach de exemplo:

...
String[] colunas = linha.split(",");
lista.add(Float.valueOf(colunas[5]));
//4a coluna e não 5a hein!? vetor/lista começa sempre do zero!!!

E por fim a ordenação, pesquise o método sort da classe List…

2 curtidas

A todos, muito obrigado pela dica, vou tentar hoje se consigo, mas o meu trabalho eu preciso criar um vetor ou lista para float, carregar ele com 10000 dados que estão em uma única coluna .csv e posteriormente ordena-los em Quick, Bubble e Insert.

Vou tentar ambos exemplos, mas pelo o que eu entendi, preciso carregar tudo na lista String e depois converter para float?

1 curtida

Não jovem, a lista já é de float:

List<Float> lista = new ArrayList<>();

E vc ja vai carregando a linha e convertendo antes de inserir…

lista.add(Float.valueOf(colunas[5])); //Por exemplo...

E não confunda vetor com Vector, vetor é um array como um int[] por exemplo, a classe Vector é outro conceito e é mais pesada que a List que te mostrei…

1 curtida

Prezados,
Fiz informe abaixo, está correto?

public static void main(String[] args) {

List lista = new ArrayList();

String nomeArquivo = "text.csv";
try {
  BufferedReader in = new BufferedReader(new FileReader(nomeArquivo));
String  linha = null;


  while ((linha = in.readLine()) != null) {
    try {
    String[] coluna = linha.split(",");
               lista.add(Float.valueof(coluna[0]);
    } catch (NumberFormatException e1) {
      // somente não insere
    }
  }
  in.close();
}
catch (IOException e) {
  System.out.println( "erro não tratado - somente indicação "); 
}  
System.out.println("Vetor não ordenado : " + v);   

}
}

Atenção aos detalhes jovem, há diferenças entre as duas formas

List<Float> lista = new ArrayList<>(); //ideal, diz ao java que a lista é de tipos Float
List lista = new ArrayList(); //sua, não diz nada ao java, podendo causar exceção...
1 curtida

Devo ter colado errado… segue abaixo, está dando erro

List<Float> lista = new ArrayList<>();

String nomeArquivo = "text.csv";
try {
  BufferedReader in = new BufferedReader(new FileReader(nomeArquivo));
String  linha = null;


  while ((linha = in.readLine()) != null) {
    try {
    String[] coluna = linha.split(",");
               lista.add(Float.valueof(coluna[0]);
    } catch (NumberFormatException e1) {
      // somente não insere
    }
  }
   in.close();
}
catch (IOException e) {
  System.out.println( "erro não tratado - somente indicação "); 
}  
System.out.println("Vetor não ordenado : " + v);`Texto pré-formatado`

Muito vago jovem, precisamos de mais informações para te ajudar, poste a stacktrace de erro mas ja imagino que pode ser na conversão adicione isso no catch

} catch (NumberFormatException e1) {
      throw e1;
}

Assim teremos mais informações para resolver, outra coisa:

Float.valueof(coluna[0]);

Vc tem certeza absoluta que no arquivo a primeira coluna guarda o valor float para ser convertido corretamente?

1 curtida

Consegui descobrir o erro e funcionou, estava faltando um ‘)’, enfim.

O arquivo CSV está como

8866,6002
8277,448731
1433,161057
9960,858334

E ao expressar a lista ele aparece apenas como 8866,0, sei que el alguns casos conseguimos expressar como %.2f, mas nesse caso essa função não resolve. E o arquivo CSV possui 6 casas decimais…

Meu código está assim agora:

{

  List<Float> lista = new ArrayList<Float>();

  String nomeArquivo = "test.csv";
  try {
    BufferedReader in = new BufferedReader(new FileReader(nomeArquivo));
  String  linha = null;


    while ((linha = in.readLine()) != null) {
      try {
      String[] coluna = linha.split(",");
                 lista.add(Float.valueOf(coluna[0]));
      } catch (NumberFormatException e1) {
        // somente não insere
      }
    }
     in.close();
  }
  catch (IOException e) {
    System.out.println( "erro não tratado - somente indicação ");
  }
  System.out.println("Vetor não ordenado :\n" + lista);

}

1 curtida

vc está guardando valor de dinheiro com virgula num arquivo CSV?

Tem ciencia de que não terá os centavos ao fazer o split?

Quando vc usa coluna[0] está pegando só a parte inteira do número ok?

Para converter o valor total por exemplo o 8866,6002 que no java vira 8866.6002 vc teria que usar outro separador no CSV, como pipe por exemplo (barra em pé) assim:

8866,6002|8866,6002
8277,448731|8277,448731
1433,161057|1433,161057
9960,858334|9960,858334

Depois no split indicar o separador:

String[] coluna = linha.split("|");

E antes de converter, trocar a virgula por ponto (senão o NumberFormatException vai reclamar):

String valorSemVirgula = coluna[0].replace(",", "."); //pulo do gato aqui!!!

Só assim para converter da forma correta, com centavos e até com casas decimais:

lista.add(Float.valueof(valorSemVirgula);

Dependendo da situação, como precisão númerica e ponto flutuante, melhor pensar usar Double, tanto na List quanto na conversão…

Bom são apenas dicas, vai brincando e aprendendo e vendo outras formas de fazer, sucesso!

1 curtida

Rodevops, o arquivo foi elaborado pelo meu professor, existe uma coluna com 10000 dados (linhas) com 6 casas decimais cada, e isso está me preendendo

Ok, arquivo pre formatado, nesse caso vale as dicas do replace, pois se nesse arquivo existe uma unica coluna, se atente bem a virgula, pois o java não reconhece, precisa ser ponto para virar float ou double fica esperto com isso.

Eu te indiquei o split no começo pois pensei que vc queria ler todas as colunas do arquivo (separadas por virgula), mas pelo que vc me diz, a virgula é parte do valor que vc quer converter confere, nesse caso nem precisa de split e basta usar replace na linha diretamente, outra forma de fazer…

String valor = linha.replace(",", ".");
lista.add(Float.valueOf(valor));

Ressalto que isso funciona se vc me garantir que o arquivo só tem essa coluna, bons estudos!

1 curtida

Muitíssimo obrigado mesmo, de coração, você me ajudou muito nessa questão, agora vou realizar a ordenação no arquivo e exibir gráfico,

E sim, ele possui apenas uma coluna no arquivo ele leu as 1000 linhas.

Precisei alterar para Double para alcançar mais precisão e ele ler todas as casas, pois em Float estava arredondando.

Uma pergunta, eu consigo ordenar essa List sem erros?

1 curtida

Para ordenação volto a recomendar o link da caelum la em cima, leia a parte de sort + comparator

1 curtida

Rodevops, correto! Lá menciona o comparator, mas eu preciso ordenar em QuickSort, e BubbleSort

Eita, aí lascou pra mim :joy:

Pesquise sobre Collections em Java, e esses algoritmos, aqui no fórum deve ter algo a respeito, essa vou ficar devendo, sucesso!

1 curtida

Enfim, já me ajudou muito. muito obrigado por tudo e maiormente pela paciência

Nós vemos por ai em outros tópicos…

Vou ver como ordenar agora.

1 curtida