【问题标题】:Java Weka - Cannot create a new output file. Standard out is usedJava Weka - 无法创建新的输出文件。使用标准输出
【发布时间】:2017-03-13 22:57:28
【问题描述】:

我有一个将 CSV 文件转换为 Weka 的 ARFF 格式的 Java 程序。

它在任何给定会话中第一次运行时都能完美运行,但随后总是失败并显示以下消息:

无法创建新的输出文件。使用标准输出。

这是程序:

import java.io.File;
import weka.core.Instances;
import weka.core.converters.ArffSaver;
import weka.core.converters.CSVLoader;

public class CSV2Arff {
      /**
   * takes 2 arguments:
   * - CSV input file
   * - ARFF output file
     * @param args
     * @throws java.lang.Exception
   */
  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.setSource(new File(args[0]));
    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();
  }
}

来自控制台的完整错误:

Oct 31, 2016 3:53:39 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-nio-8080"]
Oct 31, 2016 3:53:39 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["ajp-nio-8009"]
Oct 31, 2016 3:53:39 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 6142 ms
Cannot create a new output file. Standard out is used.

【问题讨论】:

  • 你能显示所有的堆栈跟踪吗?
  • 您是否总是使用相同的目标文件名调用程序?
  • @Kacper 是的,它应该覆盖文件。
  • @davidxxx 好的,我现在补充一下
  • 而在服务器日志 (TOMCAT_HOME/logs) 中,您没有更多详细信息吗?

标签: java csv weka


【解决方案1】:

我认为ArffSaver 不会覆盖该文件。如果要覆盖它,请在设置为目标之前删除文件(如果存在)。如果您想连接数据,请尝试writeIncremental

你有:

saver.setFile(new File(args[1]));

我会选择类似的东西:

File f = new File(args[1]);
if(f.exists()) { 
    f.delete();
};
saver.setFile(new File(args[1]);

【讨论】:

  • 这对我来说很有意义,但它实际上仍然抛出相同的错误,“无法创建新的输出文件。使用标准输出。” .我尝试清理工作目录,刷新项目,然后重新启动 Tomcat。
  • @Hack-R 你可以尝试保存到多个文件。只是为了确认问题出在使用单个文件上? int i = (int) Math.ceil(Math.random() * 10000); saver.setFile(new File(args[1] + i));
  • @Hack-R 我还稍微更改了答案中的代码。如果您能够写入多个文件,则意味着问题在于重用文件。如果你在文件名中也有额外的数字,这意味着我的想法是错误的。
  • 谢谢。我现在在家,所以我必须等到明天才能尝试,但我会继续支持你的回答。干杯。
【解决方案2】:

根据weka mail list,这个错误是文件问题。其他邮件建议使用Java I/O approch保存arff文件。

This error is coming from the CSVSaver and indicates that it is unable 
to create the directory and/or file that you've specified. More than 
likely it is something to do with permissions on where it is trying to 
write to.

试试下面的代码。

import java.io.FileWriter;
import java.io.BufferedWriter;
import java.io.File;
import weka.core.Instances;
import weka.core.converters.ArffSaver;
import weka.core.converters.CSVLoader;

public class CSV2Arff {
      /**
   * takes 2 arguments:
   * - CSV input file
   * - ARFF output file
     * @param args
     * @throws java.lang.Exception
   */
  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.setSource(new File(args[0]));
    Instances data = loader.getDataSet();
    String fileName = args[1];


    // save ARFF
    BufferedWriter writer = new BufferedWriter(new FileWriter(fileName));
    writer.write(data.toString());
    writer.flush();
    writer.close();

  }
}

【讨论】:

    猜你喜欢
    • 2010-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-14
    • 2018-08-21
    • 1970-01-01
    • 2014-11-29
    相关资源
    最近更新 更多