2010-08-18 3 views
3

J'utilise la bibliothèque Weka Java pour lire dans un fichier CSV et le convertir en un fichier ARFF.Utilisation du code Weka Java - Comment convertir un fichier CSV (sans ligne d'en-tête) en format ARFF?

Le problème est que le fichier CSV n'a pas de ligne d'en-tête, uniquement des données. Comment attribuer des noms d'attribut après avoir introduit le fichier CSV? (Toutes les colonnes seraient les types de données string)

Voici le code que j'ai jusqu'à présent:

CSVLoader loader = new CSVLoader(); 
    loader.setSource(new File(CSVFilePath)); 
    Instances data = loader.getDataSet(); 

    ArffSaver saver = new ArffSaver(); 
    saver.setInstances(data); 
    saver.setFile(new File(outputFilePath)); 
    saver.writeBatch(); 

J'ai essayé de regarder à travers le code source Weka pour comprendre cela, mais je ne pouvais pas faire des têtes ou queue de celui-ci :-(

Répondre

5

la réponse courte est, vous ne pouvez pas attribuer des noms d'attributs après vous lisez dans le fichier.

CSVLoader prend la première ligne du CSV est l'en-tête. Si c'est un Par exemple, il utilisera t les données d'instance en tant que ligne d'en-tête et non en tant que données d'instance, ce qui n'est certainement pas ce que vous voulez.

Avant le code ci-dessus, vous devez lire le fichier, écrire une ligne d'en-tête et enregistrer à nouveau le fichier.

Voir my answer to your question on the weka mailing list.

+0

Merci. Je vais essayer ça. J'ai supposé ma question à la liste de diffusion s'est perdue dans la shuffle :-( – Greg

+0

Pas de soucis, en demandant par des avenues différentes est une bonne idée :) – michaeltwofish

1

Ma solution:

SELECT 'nameColumn1','nameColumn2' 
UNION 
SELECT idColumn1,idColumn2 
FROM path 
INTO OUTFILE '/tmp/w.csv' 
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' 
LINES TERMINATED BY '\n'; 

nameColumn1 et nameColumn2 sont l'en-tête de colonne qui apparaît comme la première ligne du fichier csv.

+0

Cette solution semble un peu hors de propos, mais ok. – demongolem

2

Vous pouvez utiliser l'option -H si aucune ligne d'en-tête n'est présente dans les données.

CSVLoader loader = new CSVLoader(); 
loader.setSource(new File(CSVFilePath)); 

String[] options = new String[1]; 
options[0] = "-H"; 
loader.setOptions(options); 

Instances data = loader.getDataSet(); 

voir: http://weka.sourceforge.net/doc.dev/weka/core/converters/CSVLoader.html

+1

Il semble maintenant y avoir un raccourci, 'loader.setNoHeaderRowPresent (true)'. Voir: http://weka.sourceforge.net/doc.dev/weka/core/converters/CSVLoader.html#setNoHeaderRowPresent(boolean) –

Questions connexes