2014-09-29 42 views
1

我试图复制csv到arff指令here。我的代码复制到下面。所产生的arff正确地打印属性部分。然而,没有什么了 “@data” 部分:Weka ArffSaver没有写数据

代码:

public class CsvToArff { 
    /** 
    * takes 2 arguments: 
    * - CSV input file 
    * - ARFF output file 
    */ 
    public static void main(String[] args) throws Exception { 
    if (args.length != 2) { 
     System.out.println("\nUsage: CSV2Arff <input.csv> <output.arff>\n"); 
     System.exit(1); 
    } 

    // load CSV 
    CSVLoader loader = new CSVLoader(); 
    loader.setFieldSeparator(";"); 
    loader.setNominalAttributes("2,5,8,10"); 
    loader.setNoHeaderRowPresent(false); 
    loader.setSource(new File(args[0])); 
    loader.getStructure(); 
    Instances data = loader.getDataSet(); 

    // save ARFF 
    ArffSaver saver = new ArffSaver(); 
    saver.setInstances(data); 
    saver.setFile(new File(args[1])); 
    saver.setDestination(new File(args[1])); 
    saver.writeBatch(); 
    } 
} 

CSV文件:

PrevPause;PrevPOS;PrevLength;WordPause;WordPOS;WordLength;NextPause;NextPOS;NextLength;Location 
625;"JJ";4;156;"NN";4;1234;"FW";1;"OUT" 
156;"NN";4;1234;"FW";1;187;"NN";4;"OUT" 
1234;"FW";1;187;"NN";4;188;"VBD";3;"OUT" 

合力ARFF:

@relation mwe_pred_debug 

@attribute PrevPause numeric 
@attribute PrevPOS {JJ,NN,FW} 
@attribute PrevLength numeric 
@attribute WordPause numeric 
@attribute WordPOS {NN,FW} 
@attribute WordLength numeric 
@attribute NextPause numeric 
@attribute NextPOS {FW,NN,VBD} 
@attribute NextLength numeric 
@attribute Location {OUT} 

@data 

任何想法,为什么最后一节是空白的?

回答

1

看来,setFieldSeparator(String)和setNoHeaderRowPresent(boolean)函数最近已被添加到CSVLoader中,并且当前不在当前的稳定版本(3.6)中。也许这是Weka开发团队可以提出的。

作为一种替代方法,您可以在csv中将分号更改为逗号,并处理文档,如上面的教程中所示。该示例似乎可以正确使用您的问题中给出的数据示例和教程源进行转换。

希望这会有所帮助!

+0

谢谢!你能解释为什么,如果这些方法可以从我的weka.jar访问,它们不可用? – 2014-09-30 11:48:35

+0

它们可用,但不在当前的稳定版本中。我仅仅指出由于这些更改可能存在未记录的问题,但我试图转换您的数据,并且通过了很好的处理。至少这可以作为一个短期的解决方案,但你可能会提出与Weka开发团队的问题。 – 2014-09-30 11:53:16

+0

明白了。谢谢。它对我使用逗号很有帮助,并且摆脱了其他方法。再次感谢你。 – 2014-09-30 19:41:50