[RESOLVIDO]Ler uma linha, pedaço por pedaço!

15 respostas
A

Preciso descobrir como faço para separar os dados de uma linha e imprimir informação por informação…o arquivo que tenho é assim:

“Date/Time”;“Temperature [°C]”;“Relative humidity [%]”;“Precipitation [mm]”;“Leafwetness [U]”
“01-01-2009 00:00”;“0.0”;“0”;“0.0”;“0”
“01-01-2009 00:15”;“0.0”;“0”;“0.0”;“0”
“01-01-2009 00:30”;“0.0”;“0”;“0.0”;“0”

eu quero imprimir assim, ou mais ou menos assim:

Date/Time: 01-01-2009 00:00
Temperature [°C]: 0.0
Relative humidity [%]: 0
Precipitation [mm]: 0.0
Leafwetness [U]: 0

consigo ler o arquivo na íntegra…e pesquisando consegui chegar a isso:

Linha 0

Date/Time";"Temp
ra

re

Linha 1

01-01-2009 00:00
;"

0"

Linha 2

01-01-2009 00:15
;"

0"

Linha 3

01-01-2009 00:30
;"

0"

tá td errado…não sei como mostrar as outras informações…estou usando funções que não conheço bem…faço parte do projeto de pesquisa da minha faculdade…ou seja, sou iniciante…

alguém consegue me dar uma luz? Obrigada!

public void leArquivoSeparado(String fileName){  
         String linha;  
         ArrayList arquivo = new ArrayList();  
   
         try{  
             File file = new File(fileName);  
             Scanner scanner = new Scanner(file);  
             scanner.useDelimiter(";");  
   
         while(scanner.hasNextLine()){  
                   
                 linha = scanner.nextLine();  
             
             
             String data_hora = linha.substring(1,17);  
             String temperatura = linha.substring(18,20);  
             String umRelativa = linha.substring(21,21);  
             String precipitacao = linha.substring(22,24);  
             String molhamento = linha.substring(25,25);  
             String variavel = linha.substring(0,0); 
           
   
             HashMap hm = new HashMap();  
             hm.put("variavel",variavel); 
             hm.put("data/hora",data_hora);  
             hm.put("temperatura",temperatura);  
             hm.put("umidade relativa",umRelativa);  
             hm.put("precipitação",precipitacao);  
             hm.put("molhamento",molhamento);  
               
   
             arquivo.add(hm);  
   
             }  
   
         arquivo.trimToSize();  
   
         }catch(FileNotFoundException e){  
             e.printStackTrace();  
         }  
   
         for (int i=0;i<arquivo.size();i++) {  
             HashMap hm = (HashMap)arquivo.get(i);  
             System.out.println("Linha " + i);  
             System.out.println(hm.get("variavel"));
             System.out.println(hm.get("data/hora"));  
             System.out.println(hm.get("temperatura"));  
             System.out.println(hm.get("umidade relativa"));  
             System.out.println(hm.get("precipitação"));  
             System.out.println(hm.get("molhamento"));  
      
     }  
     }

15 Respostas

G

coloca split e em vez de usar netxline coloca so next acho q da.

T

Tenta com split. exemplo:

String linha = new String("pedro; paulo; jose");
		String[] vet = linha.split(";");
		for (int i = 0; i < vet.length; i++){
			System.out.println(vet[i]);
		}
R

Você pode usar um parser de csv para java.
Um exemplo de parser seria esse:

http://opencsv.sourceforge.net/

A

Tente isso:

String dados = "\"Date/Time\";\"Temperature [°C]\";\"Relative humidity [%]\";\"Precipitation [mm]\";\"Leafwetness [U]\"\n\"01-01-2009 00:00\";\"0.0\";\"0\";\"0.0\";\"0\"\n\"01-01-2009 00:15\";\"0.0\";\"0\";\"0.0\";\"0\"\n\"01-01-2009 00:30\";\"0.0\";\"0\";\"0.0\";\"0\"";
		
		Scanner sc = new Scanner(new StringReader(dados));
		
		String cabecalho = sc.nextLine();
		
		String[][] dadosFormatados = new String[dados.split("\n").length][cabecalho.split(";").length];
		
		
		int contador = 1;
		
		
		String[] pedacosCabecalho = cabecalho.split(";");
		
		for (int i = 0; i < pedacosCabecalho.length; i++) {
			dadosFormatados[0][i] = pedacosCabecalho[i];
		}
		
		while (sc.hasNextLine()) {
			String linha = sc.nextLine();
			
			String[] pedacos = linha.split(";");
			
			for (int i = 0; i < pedacos.length; i++) {
				dadosFormatados[contador][i] = pedacos[i];
			}
			
			contador++;
		}

No final, dadosFormatados vai conter tudo.

[]´s

A

O processo todo que eu tenho que fazer é o seguinte:

eu tenho um arquivo, com os dados…(arq1.txt),
eu tenho que ler este arquivo, que deve ter umas 2000 linhas (sem exagero), separadamente, dado por dado,
e então jogar estas informações dentro dos campos de uma tabela no postgreSQL…

eu sei ler o arquivo…eu sei inserir informações no banco…só não sei como fazer isso td junto e ainda por cima separando as informações…esta hr do dia tbm já estou entrando em parafusos…ehehe…mas obrigada gente, pela ajuda…vou continuar a tentar implementando as dicas de vcs…

V

Agora sim, testado:

ClimateDataReader.Java

package climate;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class ClimateDataReader {
    private static final int DATE = 0;
    private static final int TEMPERATURE = 1;
    private static final int UMIDITY = 2;
    private static final int PRECIPITATION = 3;
    private static final int WETNESS = 4;    

    public static List&lt;ClimateData&gt; readClimateData(File file) throws FileNotFoundException
    {        
        Scanner reader = new Scanner(file);
        List&lt;ClimateData&gt; list = new ArrayList&lt;ClimateData&gt;();
        
        int i = 0;
        while (reader.hasNextLine())
        {
            i++;
            String line = reader.nextLine().replace("\"", "");
            if (i == 1)    //Skip the header line
                continue;

            String fields[] = line.split(";");

            try
            {
                ClimateData cd = new ClimateData(
                        fields[DATE],
                        Double.parseDouble(fields[TEMPERATURE]),
                        Integer.parseInt(fields[UMIDITY]),
                        Double.parseDouble(fields[PRECIPITATION]),
                        Integer.parseInt(fields[WETNESS])
                );
                
                list.add(cd);
            }
            catch (Exception e)
            {
                System.err.println("Problem parsing line " + i + ": " + line);
            }
        }
        return list;
    }

    public static void main(String[] args)
    {
        try {
            int i = 0;
            for (ClimateData data : readClimateData(new File("C:/Teste.txt"))) {
                i++;
                System.out.println("Linha " + i);
                System.out.println(data);
                System.out.println("");
            }
        } catch (FileNotFoundException ex) {
            System.out.println("Arquivo não encontrado!");
        }
    }
}

ClimateDate.java

package climate;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class ClimateData implements Comparable&lt;ClimateData&gt; {
    public static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("dd-MM-yyyy hh:mm");

    private Calendar dateTime;
    private double temperature;
    private int relativeUmidity;
    private double precipitation;
    private int leafWetness;

    public ClimateData(Date dateTime, double temperature, int relativeUmidity, double precipitation, int leafWetness)
    {
        if (dateTime == null)
            throw new IllegalArgumentException("Date time cannot be null!");


        this.dateTime = Calendar.getInstance();
        this.dateTime.setTime(dateTime);
        this.temperature = temperature;
        this.relativeUmidity = relativeUmidity;
        this.precipitation = precipitation;
        this.leafWetness = leafWetness;
    }

    public ClimateData(String dateTime, double temperature, int relativeUmidity, double precipitation, int leafWetness) throws ParseException {
        this(DATE_FORMAT.parse(dateTime), temperature, relativeUmidity, precipitation, leafWetness);
    }

    public Calendar getDateTime() {
        return dateTime;
    }

    public int getLeafWetness() {
        return leafWetness;
    }

    public double getPrecipitation() {
        return precipitation;
    }

    public int getRelativeUmidity() {
        return relativeUmidity;
    }

    public double getTemperature() {
        return temperature;
    }

    public int compareTo(ClimateData o) {
        return dateTime.compareTo(o.dateTime);
    }

    @Override
    public String toString() {
        return String.format("Date/Time: %s%n +" +
                "Temperature [°C]: %.1f%n" +
                "Relative humidity [%%]: %d%n" +
                "Precipitation [mm]: %.1f%n" +
                "Leafwetness [U]: %d",
                DATE_FORMAT.format(getDateTime().getTime()),
                getTemperature(), getRelativeUmidity(), getPrecipitation(),
                getLeafWetness());
    }


}

Algumas coisas importantes:

  1. Sempre faça o parse para o tipo de dados certos. No caso, transforme as datas em Date e os números em int e double. Transforme dados em novamente String apenas na hora de exibi-los;
  2. Crie uma classe de negócios para representar seu dado (como a ClimateData);
A

eu vou olhar já, já em casa…mas já fiquei feliiz!!!
Obrigada!!

V

Pronto, agora está testada. Já atualizei com as correções lá em cima.

A

ViniGodoy …

Tu é um annnnjo!! Melhor impossível…eu juro que não sou burra, mas sozinha ia demorar demaais pra conseguir!!!
Muito Obrigada!!!

Abraços!! Espero poder retribuir!!

A

tu reparou que ele lê as horas até o 12 e volta pro um? mas acho que pelo menos isso que consigo resolver sozinha…eheheh

Não consigo parar de agradecer!! Obrigada!!!

Abraços…

V

Ali no SimpleDateFormat, troca o hh minúsculo para HH maiúsculo. Isso troca do padrão de 12h para o de 24h.

A

pzé…isso eu descobri facinho…

Tu trabalha ou já trabalhou com modelos de simulações tbm?

V

Só acompanho como hobista.

A

ViniGodoy

Como eu poderia resumir estas duas classes?? Eu entendo o que elas fazem, e qual é o papel de cada uma…mas como tu explicaria para alguém que não conhece Java? Preciso apresentar um seminário sobre a minha pesquisa e algumas das pessoas que vão assistir não conhecem a linguagem…que tu diz? :smiley:

V

A ClimateData representa os dados do modelo climático que foram observados.
O ClimateDataReader é uma pequena classe para ler esses dados de um arquivo de textos.

Acho melhor no seu seminário vc explicar pq escolheu esses dados em questão, qual é o tamanho de sua amostragem, etc. Fale mais da importância dos dados e do projeto em si, não tanto da parte computacional. Essas classes estão lá, mas certamente não são o ponto mais relevante do software. Se tiver que falar de software, a parte que entrará em destaque será o processamento disso e os relatórios.

Criado 26 de agosto de 2010
Ultima resposta 30 de out. de 2010
Respostas 15
Participantes 6