Miner rapide: CSV avec des nombres réels avec des virgules au lieu de points
-
28-10-2019 - |
Question
J'ai un problème à importer un fichier CSV avec RapidMiner. Les valeurs de points flottants sont écrites avec des virgules au lieu du point séparant entre les valeurs entières et décimales.
Quelqu'un sait-il comment importer correctement les valeurs formatées de cette manière?
Exemples de données:
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 l'interprète en fait comme "polynôme". Le forcer à "réel" ne conduit qu'à une interprétation correcte de la valeur "0".
Merci
La solution
Utilisez le semi-colon comme délimiteur. Vous pouvez utiliser java.util.Scanner
pour lire chaque ligne. String.split()
se séparer sur le demi-colon. Lorsque vous obtenez un jeton avec une virgule, vous pouvez utiliser String.replace()
Pour changer la virgule en décimal. Alors vous pouvez utiliser Float.parseFloat()
J'espère que cela vous répond.
Autres conseils
Cela semble être une très vieille demande. Je ne sais pas si cela vous aidera, mais cela peut aider les autres dans une situation similaire.
Étape 1: Dans l'opérateur "Read CSV", sous "Assistant d'importation de configuration", assurez-vous de sélectionner "Semicolon" comme séparateur
Étape 2: Utilisez l'opérateur "Guess Types". Type de filtre d'attribut -> Sous-ensemble, sélectionnez Attributs -> Sélectionnez les attributs 8, 9 et 16 (en fonction de votre exemple ci-dessus), modifiez le "caractères de point décimal" en "," et vous devez être tous définis.
J'espère que cela aide (quelqu'un!)
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).
}
}