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

3
我有一个Java程序,可以将CSV文件转换为Weka的ARFF格式。
第一次在任何会话中运行时,它能够完美地工作。然而,之后每次运行都会失败,并显示以下消息:
“无法创建新的输出文件。使用标准输出。”
以下是程序:
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.

你能展示所有的堆栈跟踪吗? - davidxxx
@Kacper 是的,它应该覆盖文件。 - Hack-R
@davidxxx 当然,我现在会添加。 - Hack-R
@davidxxx 当然可以。还有更多内容,但那些都是我确定与此问题无关的东西,因为我已经看过其他信息很多次了。这是完整的日志:https://gist.github.com/anonymous/8c3ffedc8d6ceca65cbd8ba5552c14e2 - Hack-R
"SLF4J: 无法加载类“org.slf4j.impl.StaticLoggerBinder”。SLF4J: 默认使用无操作(NOP)记录器实现”表示日志已被禁用。您应该方便地配置SLF4J以启用日志,并在异常发生时拥有调试信息。" - davidxxx
显示剩余2条评论
2个回答

3
根据weka邮件列表的说法,这个错误是一个文件问题。其他电子邮件建议使用Java I/O方法保存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();

  }
}

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
@Hack-R,你能不能试着保存到多个文件?只是为了确认问题出在使用单个文件上?int i = (int) Math.ceil(Math.random() * 10000); saver.setFile(new File(args[1] + i)); - Kacper
@Hack-R,我还稍微修改了我的答案中的代码。如果您能够写入多个文件,则意味着问题出在重复使用文件上。如果您在文件名中添加其他数字时仍然出现错误,则意味着我的想法是错误的。 - Kacper
谢谢。我现在在家,所以得等到明天才能试一下,但我会点赞你的回答。干杯。 - Hack-R

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接