【问题标题】:Missing value delimiter at position位置处缺少值分隔符
【发布时间】:2018-06-27 19:53:50
【问题描述】:

在使用 Java 导入 CSV 文件时出现“位置 1 处缺少值分隔符”错误。

这是我的代码:

 protected int getFieldCount() 
{       
    return 3;
}
protected void importRecord(List<String> record, int lineNumber) {
 String rawScore = record.get(ELEMENT_RAW_SCORE).trim();
 String contextScore = record.get(ELEMENT_CONTEXT).trim();
 String subtest = record.get(ELEMENT_SUBTEST).trim();
}

如果我的 csv 文件如下所示:

95,Performance Scale,codes,       
ME,Performance Scale,Numbers,test
NM,Scale,Strategies,

当我在其中一行中留下额外的字符时,因为第 2 行中有“测试”,我收到错误,否则导入运行正常。即使我只添加到其中一行,也会为每一行显示错误。

getFieldCount() 方法返回 int 应出现在源文件中每条记录中的预期字段数,如果未严格执行字段数,则返回非正值。

split("\t") 等字符串方法不起作用,因为它不是导致此问题的制表符分隔符。代码在第 3 列之后不会停止阅读,即使我严格执行它也是如此。我怎么能告诉它在第 3 列之后没有读取任何内容?

【问题讨论】:

    标签: java csv delimiter


    【解决方案1】:

    不确定您是如何读取 csv 数据的,但您的 csv 有 4 列,而不是 3 列:

    95,Performance Scale,codes,       
    ME,Performance Scale,Numbers,test
    NM,Scale,Strategies,
    

    第 1 行和第 3 行的第四列有一个空值,但这算作一列。

    所以也许尝试为 fieldcount 返回 4:

    protected int getFieldCount() 
    {       
        return 4;
    }
    

    【讨论】:

    • 我在 Excel 中编辑 csv 文件,当我在第 4 列中添加一个字符时,Excel 会自动为每一行添加逗号。但是我希望我的程序在每行的每条记录中遇到第三个分隔符后跳过字符,如果只有 2 个分隔符,不要跳过任何内容。
    • @HarpreetSidhu 好吧,这取决于如何读取行。如果您使用的是 csv 阅读器,您可能会收到错误,因为阅读器/解析器遇到了第四个字段,其中只有 3 个作为字段计数给出。我只会返回正确的字段计数(在这种情况下为 4),并且只处理 importRecord() 中的前 3 个。或者可能返回 -1(正如您在帖子中提到的)作为字段计数以强制进行某种自动检测。
    • @Danny_ds,我尝试返回 4,如果有额外的列,它可以工作,但如果源文件中只有 3 列,它就不行。我想,我需要修改 getFieldCount() 以适应变量号。列,并且只使用我在 importRecord() 方法中需要的那些。谢谢@Danny_ds,你的想法很有帮助!
    • @HarpreetSidhu 是的,看起来您使用的阅读器需要准确的字段数。
    猜你喜欢
    • 2011-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-23
    • 2018-04-25
    • 2010-10-29
    • 1970-01-01
    相关资源
    最近更新 更多