在Android中使用Weka将CSV转换为ARFF时出错 [英] Errors when converting CSV to ARFF in Android using Weka

查看:148
本文介绍了在Android中使用Weka将CSV转换为ARFF时出错的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在演唱在weka网站上找到的代码和说明 https://weka .wikispaces.com/Converting + CSV + to + ARFF
但是由于某种原因,它给了我错误.注意,我检查以确保文件存在并且可读.


CSVLoader.java的代码
https://github.com/rjmarsan/Weka-for-Android/blob/925a77b566d6e55a775911fbf317234d11ec8024/src/weka/core/converters/CSVLoader.java


Android代码

                    String input = Environment.getExternalStorageDirectory().getAbsolutePath()+"/homework1/user_patterns.csv";
                    String output = Environment.getExternalStorageDirectory().getAbsolutePath()+"/homework1/user_patterns.arff";
                    Instances data = null;

                    try {
                        File inputFile = new File(input);
                        System.out.println(inputFile.exists());
                        System.out.println(inputFile.canRead());

                        // load CSV
                        CSVLoader loader = new CSVLoader();
                        loader.setSource(inputFile);
                        data = loader.getDataSet();

                        // save ARFF
                        ArffSaver saver = new ArffSaver();
                        saver.setInstances(data);
                        saver.setFile(new File(output));
                        saver.writeBatch();
                    } catch (IOException err) {
                        System.out.println(err);
                    }

堆栈跟踪

09-30 15:23:03.810  22869-22869/com.weka W/dalvikvm﹕ Exception Ljava/lang/NullPointerException; thrown while initializing Lweka/core/converters/ConverterUtils;
09-30 15:23:03.810  22869-22869/com.weka W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0xa4d12b20)
09-30 15:23:03.814  22869-22869/com.weka E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.weka, PID: 22869
    java.lang.ExceptionInInitializerError
            at weka.core.converters.CSVLoader.readHeader(CSVLoader.java:882)
            at weka.core.converters.CSVLoader.readStructure(CSVLoader.java:534)
            at weka.core.converters.CSVLoader.getStructure(CSVLoader.java:519)
            at weka.core.converters.CSVLoader.getDataSet(CSVLoader.java:552)
            at com.weka.MainMenu$1.onClick(MainMenu.java:105)
            at android.view.View.performClick(View.java:4438)
            at android.view.View$PerformClick.run(View.java:18422)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5001)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.NullPointerException
            at weka.core.converters.ConverterUtils.<clinit>(ConverterUtils.java:741)
            at weka.core.converters.CSVLoader.readHeader(CSVLoader.java:882)
            at weka.core.converters.CSVLoader.readStructure(CSVLoader.java:534)
            at weka.core.converters.CSVLoader.getStructure(CSVLoader.java:519)
            at weka.core.converters.CSVLoader.getDataSet(CSVLoader.java:552)
            at com.weka.MainMenu$1.onClick(MainMenu.java:105)
            at android.view.View.performClick(View.java:4438)
            at android.view.View$PerformClick.run(View.java:18422)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5001)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
            at dalvik.system.NativeStart.main(Native Method)

请注意,MainMenu.java:105引用了data = loader.getDataSet();

解决方案

您链接的源代码仅在 weka.core.converters.ConverterUtils.java 行741中包含注释,因此猜测您实际使用的是 https ://www.pervasive.jku.at/Teaching/lvaInfo.php?key = 346& do = uebungen

问题在于,在静态类初始化程序中,几乎所有内容都被注释掉了,仅留下第741行会失败,因为调用m_FileLoaders.size()时静态字段m_FileLoaders仍为null:

/** all available loaders (extension &lt;-&gt; classname). */
protected static Hashtable<String,String> m_FileLoaders;
[...]

// determine all loaders/savers
static {
  Vector classnames;

  try {
    // generate properties 
    // Note: does NOT work with RMI, hence m_FileLoadersCore/m_FileSaversCore
    /* GenericPropertiesCreator creator = new GenericPropertiesCreator();
       creator.execute(false);
       Properties props = creator.getOutputProperties();
       // init
       m_FileLoaders    = new Hashtable<String,String>();
       [...]
    */
    }
    catch (Exception e) {
      // ignore
    }
    finally {
      // loaders
      if (m_FileLoaders.size() == 0) {
      /*classnames = GenericObjectEditor.getClassnames(AbstractFileLoader.class.getName());
      [...]
      */
      }
    }
  }

总而言之,我最好的猜测是罐子是破损的,所以您可以自己修理它,或者得到一个不破损的瓶子.

(顺便说一句:另一个具有相同问题的问题.)

I'm sing the code and instructions found on the weka site https://weka.wikispaces.com/Converting+CSV+to+ARFF
But for some reason its giving me errors. Notice I check to make sure the file exists and is readable.


Code for CSVLoader.java
https://github.com/rjmarsan/Weka-for-Android/blob/925a77b566d6e55a775911fbf317234d11ec8024/src/weka/core/converters/CSVLoader.java


Android Code

                    String input = Environment.getExternalStorageDirectory().getAbsolutePath()+"/homework1/user_patterns.csv";
                    String output = Environment.getExternalStorageDirectory().getAbsolutePath()+"/homework1/user_patterns.arff";
                    Instances data = null;

                    try {
                        File inputFile = new File(input);
                        System.out.println(inputFile.exists());
                        System.out.println(inputFile.canRead());

                        // load CSV
                        CSVLoader loader = new CSVLoader();
                        loader.setSource(inputFile);
                        data = loader.getDataSet();

                        // save ARFF
                        ArffSaver saver = new ArffSaver();
                        saver.setInstances(data);
                        saver.setFile(new File(output));
                        saver.writeBatch();
                    } catch (IOException err) {
                        System.out.println(err);
                    }

Stack Trace

09-30 15:23:03.810  22869-22869/com.weka W/dalvikvm﹕ Exception Ljava/lang/NullPointerException; thrown while initializing Lweka/core/converters/ConverterUtils;
09-30 15:23:03.810  22869-22869/com.weka W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0xa4d12b20)
09-30 15:23:03.814  22869-22869/com.weka E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.weka, PID: 22869
    java.lang.ExceptionInInitializerError
            at weka.core.converters.CSVLoader.readHeader(CSVLoader.java:882)
            at weka.core.converters.CSVLoader.readStructure(CSVLoader.java:534)
            at weka.core.converters.CSVLoader.getStructure(CSVLoader.java:519)
            at weka.core.converters.CSVLoader.getDataSet(CSVLoader.java:552)
            at com.weka.MainMenu$1.onClick(MainMenu.java:105)
            at android.view.View.performClick(View.java:4438)
            at android.view.View$PerformClick.run(View.java:18422)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5001)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.NullPointerException
            at weka.core.converters.ConverterUtils.<clinit>(ConverterUtils.java:741)
            at weka.core.converters.CSVLoader.readHeader(CSVLoader.java:882)
            at weka.core.converters.CSVLoader.readStructure(CSVLoader.java:534)
            at weka.core.converters.CSVLoader.getStructure(CSVLoader.java:519)
            at weka.core.converters.CSVLoader.getDataSet(CSVLoader.java:552)
            at com.weka.MainMenu$1.onClick(MainMenu.java:105)
            at android.view.View.performClick(View.java:4438)
            at android.view.View$PerformClick.run(View.java:18422)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5001)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
            at dalvik.system.NativeStart.main(Native Method)

Note that MainMenu.java:105 refers to data = loader.getDataSet();

解决方案

The source code you linked only contains a comment in weka.core.converters.ConverterUtils.java line 741, so I'm guessing that what you are actually using is the jar from here: https://www.pervasive.jku.at/Teaching/lvaInfo.php?key=346&do=uebungen

The problem there is that in the static class initializer, almost everything is commented out, leaving only line 741 that will fail because the static field m_FileLoaders is still null when m_FileLoaders.size() is called:

/** all available loaders (extension &lt;-&gt; classname). */
protected static Hashtable<String,String> m_FileLoaders;
[...]

// determine all loaders/savers
static {
  Vector classnames;

  try {
    // generate properties 
    // Note: does NOT work with RMI, hence m_FileLoadersCore/m_FileSaversCore
    /* GenericPropertiesCreator creator = new GenericPropertiesCreator();
       creator.execute(false);
       Properties props = creator.getOutputProperties();
       // init
       m_FileLoaders    = new Hashtable<String,String>();
       [...]
    */
    }
    catch (Exception e) {
      // ignore
    }
    finally {
      // loaders
      if (m_FileLoaders.size() == 0) {
      /*classnames = GenericObjectEditor.getClassnames(AbstractFileLoader.class.getName());
      [...]
      */
      }
    }
  }

All in all, my best guess is that the jar is broken, so either you fix it yourself or get a non-broken one.

(Btw: Another question with the same problem.)

这篇关于在Android中使用Weka将CSV转换为ARFF时出错的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆