Domanda

Ho un problema durante l'importazione di un file CSV con RapidMiner. I valori in virgola mobile vengono scritti con virgole invece del punto di separazione tra i valori interi e decimali.

Qualcuno sa come importare correttamente i valori formattati in questo modo?

dati di esempio:

BMI;1;0;1;1;1;blue;-0,138812155;0,520378909;5;0;50;107;0;9;0;other;good;2011 BMI;1;0;1;1;1;pink;-0,624654696;;8;0;73;120;1;3;0,882638889;other;good;2011

Rapid miner lo interpreta effettivamente come "polinomio".Forzarlo a "reale" porta solo a una corretta interpretazione del valore "0".

grazie

È stato utile?

Soluzione

Utilizza il punto e virgola come delimitatore.È possibile utilizzare java.util.Scanner per leggere ogni riga.String.split() da dividere sul punto e virgola.Quando ottieni un token con una virgola puoi usare String.replace() per cambiare la virgola in un decimale.Quindi puoi utilizzare Float.parseFloat()

Spero che questo risponda alla tua domanda.

Altri suggerimenti

Questa sembra essere una richiesta molto vecchia.Non sono sicuro se questo ti aiuterà, ma potrebbe aiutare altri in una situazione simile.

Passaggio 1: nell'operatore "Leggi CSV", in "importazione guidata configurazione", assicurati di selezionare "Punto e virgola" come separatore

Passaggio 2: utilizza l'operatore "Indovina i tipi".Tipo di filtro attributo -> Sottoinsieme, Seleziona attributi -> seleziona gli attributi 8, 9 e 16 (in base al tuo esempio sopra), cambia "carattere punto decimale" in "," e dovresti essere tutto a posto.

Spero che questo aiuti (qualcuno!)

public static void main(String args){
    BufferedReader br = new BufferedReader(new FileReader("c:\\path\\semicolons and numbers and commas.csv"));
    try {
        for(String line; (line=br.readLine()) != null);) {
            //Variable line now has a single line from the file. This code will execute for each line.
            String array = line.split(";");// Split on the semicolon. Beware of changing this. This uses regex which means that some characters mean something like . means anything, not just dots.
            double firstDouble = Double.parseDouble(array[7].replace(',','.')); // Get field 7 (the eighth field) and turn it into a double (high precision floating point). Replace , with . so it will not make an error
            System.err.println("Have a number " + firstDouble);
            System.err.println("Can play with it " + (firstDouble * 2.0));
        }
    }finally{
        br.close(); // Free resources (and unlock file on Windows).
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top