java - Weka CSVloader - 错误(值的数量错误。读取)

标签 java weka

我正在尝试使用 weka 将 CSV 转换为 ARFF。但它会弹出那些错误消息。

weka.core.converters.CSVLoaderfailed to lead <my file>
Reason:
wrong number of values. Read 7, expected 9, read Token[EOL], line 26

我尝试替换 "' , % 这些特殊字符,但也保持不变。

有什么想法吗?

https://drive.google.com/open?id=1__u9SGOxd-ShU9Eei3tDjZ9s1MxzKEKZ 链接的文件

最佳答案

简短回答:

值内部的换行符是问题所在。将它们替换为其他内容,例如空格。

长答案:

问题是您的值包含换行符(\n 等),并且 Weka 的 CSVLoader 无法处理它。第 26 行是文件中包含此类换行符的第一行,但 CSVLoader 在仅读取 7 个字段后认为该行在此结束。

看看 source code :

private void initTokenizer(StreamTokenizer tokenizer) {
  tokenizer.resetSyntax();
  tokenizer.whitespaceChars(0, (' ' - 1));
  tokenizer.wordChars(' ', '\u00FF');
  tokenizer.whitespaceChars(m_FieldSeparator.charAt(0),
    m_FieldSeparator.charAt(0));
  // tokenizer.commentChar('%');

  String[] parts = m_Enclosures.split(",");
  for (String e : parts) {
    if (e.length() > 1 || e.length() == 0) {
      throw new IllegalArgumentException(
        "Enclosures can only be single characters");
    }
    tokenizer.quoteChar(e.charAt(0));
  }

  tokenizer.eolIsSignificant(true);    // <--- This line is important
}

最后一行基本上表示分词器应将行尾 (EOL) 视为特殊字符(请参阅 API doc ):

If the flag is false, end-of-line characters are treated as white space and serve only to separate tokens.

CSVLoader 的 getInstance 方法包含以下逻辑(摘要):

private String getInstance(StreamTokenizer tokenizer) throws IOException {  

    // [...]

    boolean first = true;
    boolean wasSep;
    m_current.clear();

    int i = 0;
    while (tokenizer.ttype != StreamTokenizer.TT_EOL
      && tokenizer.ttype != StreamTokenizer.TT_EOF) {

      // Get next token
      if (!first) {
        StreamTokenizerUtils.getToken(tokenizer);
      }

      if (tokenizer.ttype == m_FieldSeparator.charAt(0)
        || tokenizer.ttype == StreamTokenizer.TT_EOL) {
        m_current.add("?");
        wasSep = true;
      } else {
        // Parsing values
        // [...]
      }

      if (!wasSep) {
        StreamTokenizerUtils.getToken(tokenizer);
      }
      first = false;
      i++;
    }

    // check number of values read
    if (m_current.size() != m_structure.numAttributes()) {
      for (Object o : m_current) {
        System.out.print(o.toString() + "|||");
      }
      System.out.println();
      StreamTokenizerUtils.errms(tokenizer, "wrong number of values. Read "
        + m_current.size() + ", expected " + m_structure.numAttributes());

    }
  // [...]
}

因此,无论换行符是否在引号内,标记生成器都将始终将其视为 StreamTokenizer.TT_EOL,这会结束读取记录,因此最终得到的字段少于预期。

关于java - Weka CSVloader - 错误(值的数量错误。读取),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52286909/

相关文章:

java - Weka 的 PCA 运行时间太长

java - 使用Weka将文件拆分为测试文件和训练文件

java - 为什么我们在weka评估函数中使用训练数据?

java - 如何使用ExecutorService获取所有提交任务的结果?

java - 在 Java 中迭代对象的 TreeMap(不是字符串!!)

java - 无法配置 Spring Batch 以因此运行作业

java - 如何在简单的Servlet中使用Spring Data JPA?

java - 更简单的逻辑条件来检查非空要求

Weka数据加载错误

c# - 在C#中使用weka : Unable to cast object of type 'java.util.ArrayList' to type 'System.Collections.Generic.List`