混乱的 CSV 会导致异常

2023-12-15

我想我发现了一个错误。或者也许不是,但 Super CSV 无法很好地处理。

我正在使用 MapReader 解析包含 41 列的 CSV 文件。但是,我收到了 CSV - 并且为我提供 CSV 的 Web 服务弄乱了一行。 “标题”行是一个制表符分隔的行,包含 41 个单元格。

“错误行”是一个由制表符分隔的包含 36 个单元格的行,并且内容没有任何意义。

这是我正在使用的代码:


InputStream fis = new FileInputStream(pathToCsv);
InputStreamReader inReader = new InputStreamReader(fis, "ISO-8859-1");

ICsvMapReader mapReader = new CsvMapReader(inReader, new CsvPreference.Builder('"','\t',"\r\n").build());
final String[] headers = mapReader.getHeader(true);
Map<String, String> row;
while( (row = mapReader.read(headers)) != null ) {

    // do something


}

在上面提到的行中执行 mapReader.read(headers) 时出现异常。这是例外:

org.supercsv.exception.SuperCsvException: 
the nameMapping array and the sourceList should be the same size (nameMapping length = 41, sourceList size = 36)
context=null
at org.supercsv.util.Util.filterListToMap(Util.java:121)
at org.supercsv.io.CsvMapReader.read(CsvMapReader.java:79)
at test.MyClass.readCSV(MyClass.java:20)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)

你觉得我应该怎么做 ?

我不希望整个应用程序崩溃,只是因为一行被搞乱了,我宁愿跳过该行。


这是一个很好的问题!作为一名超级 CSV 开发人员,我将研究在website.

您可以保持简单并使用 CsvListReader (它不关心有多少列),然后自己创建 Map :

public class HandlingExceptions {

    private static final String INPUT = 
        "name\tage\nTom\t25\nAlice\nJim\t44\nMary\t33\tInvalid";

    public static void main(String[] args) throws IOException {

        // use CsvListReader (can't be sure there's the correct no. of columns)
        ICsvListReader listReader = new CsvListReader(new StringReader(INPUT), 
            new CsvPreference.Builder('"', '\t', "\r\n").build());

        final String[] headers = listReader.getHeader(true);

        List<String> row = null;
        while ((row = listReader.read()) != null) {

            if (listReader.length() != headers.length) {
                // skip row with invalid number of columns
                System.out.println("skipping invalid row: " + row);
                continue;
            }

            // safe to create map now
            Map<String, String> rowMap = new HashMap<String, String>();
            Util.filterListToMap(rowMap, headers, row);

            // do something with your map
            System.out.println(rowMap);
        }
        listReader.close();
    }
}

Output:

{name=Tom, age=25}
skipping invalid row: [Alice]
{name=Jim, age=44}
skipping invalid row: [Mary, 33, Invalid]

如果您担心使用超级 CSVUtil类(它可能会改变 - 它实际上是一个内部实用程序类),你可以按照我的建议组合 2 个阅读器here.

你可以尝试捕捉SuperCsvException,但您最终可能会抑制的不仅仅是无效数量的列。我建议捕获的唯一超级 CSV 异常(尽管不适用于您的情况,因为您没有使用单元处理器)是SuperCsvConstraintViolationException,因为它表明文件的格式正确,但数据不满足您的预期约束。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

混乱的 CSV 会导致异常 的相关文章

随机推荐

  • 将实例的一个属性与一组其他实例进行比较

    我正在尝试编写一个实例方法Card将单张卡与数组进行比较的类 该类具有一些属性 例如 shape and color The otherCards数组中充满了此类的其他实例 这些实例也有它们的shapes and colors 现在 我想编
  • 显示所有打开的 RODBC 连接

    有谁知道如何做到这一点 showConnections 不会列出来自 odbcConnect 的任何打开的连接 您可以通过以下方式缩小搜索范围 这将返回当前环境中 RODBC 类的所有变量 envVariables lt ls bools
  • MongoDB .Net 驱动程序 2.0 Pull(删除元素)

    你能帮我用 2 0 驱动程序正确运行 拉 删除 吗 我有一个像这样的集合 我想通过关注者字段删除第一个名为 fethiye 的关注者 id ObjectId 554e05dfc90d3d4dfcaa2aea username bodrum
  • 为什么设置 MenuItem.InputGestureText 不会导致当我执行输入手势时激活 MenuItem?

    我想实现键盘快捷键MenuItem 我使用了下面的代码
  • 在 #define 宏中转义 # 符号?

    在不涉及血淋淋的细节的情况下 我想使用 define宏将扩展为 include但 符号使预处理器感到困惑 因为它认为我想引用一个参数 例如 我想做这样的事情 define MACRO name include name foo 并这样使用它
  • 在 Azure 上找不到“Microsoft.SqlServer.Types”版本 10 或更高版本

    我正在尝试在 ASP NET MVC 4 中创建一个 Web api 该 webapi 使用实体框架 5 空间类型 并且我编写了一个非常简单的代码 public List area GetAllAreas List area aList d
  • 在 React 功能组件中使用 Cornerstone.js 中的堆栈滚动工具时,如何访问“currentImageIdIndex”?

    我目前正在 React 组件中成功显示一堆图像 但不确定在哪里放置事件侦听器以便访问currentImageIdIndex滚动时 import React useEffect useRef useCallback from react im
  • fancybox 图像上的自定义宽度和高度

    我想知道是否可以在 fancybox 图像上设置自定义宽度和高度 作为标准 fancybox 的宽度和高度相对于图像的宽度和高度而变化 但我希望所有图像的宽度为 800 高度为 600 我想创建一些与 Facebook 上的图像框相似的内容
  • 通过使用最小交换交换相邻元素来对序列进行排序

    我们有一个未排序的 N 个数字序列 1 2 3 4 N 我们可以通过按特定顺序交换相邻元素来对整个序列进行排序 给定一个序列 如何计算对序列进行排序所需的最小可能交换 作为示例 请考虑序列 4 2 5 3 1 对此进行排序的最佳方法是按以下
  • 使用REGEX用SED解析括号

    我正在寻找命令sed它转换这个输入流 dummy key1 key2 dummy key3 dummy key4 dummy dummy key5 dummy dummy dummy key6 dummy key7 dummy 进入这个 k
  • 下一个更高的素数和回文数

    是否有关于从给定的整数中求解下一个更高的素数和回文数的建议 这是我正在尝试的片段 但它有点慢 请建议我是否有任何好的算法可以测试 usr bin python def next higher n while True s str n if
  • 报告设计无效。未找到字段 Jasper 报告

    我正在尝试创建一个基本的碧玉报告JRBeanCollectionDataSource 在那里 我有一个 javabean 内的对象列表 public class Course private int id private List
  • 计算pandas数据框中每列值的变化

    有没有什么巧妙的方法来计算 pandas 数据框中每列值的变化次数 我不想在每一列上循环 例如 import pandas as pd frame pd DataFrame time 1234567000 1234567005 123456
  • AngularJs指令添加属性,事件不被触发

    大家早上好 我对这个指令有点困惑 我想要的是从 getProperties 函数接收一个 JSON 字符串 例如 class someclass ng change someChange ng click someCLick 该指令将创建
  • Android 寻呼机暂停问题

    我正在使用 Pager 和兼容性库构建一个应用程序 每当我尝试暂停应用程序时 例如 当我回到桌面时 我的应用程序都会强制关闭 我从未遇到过此类错误 因此我不知道如何解决它 我将向您展示我的代码 而我确信您不必查看它 public class
  • 使用Functional Swift 求斐波那契项的总和

    我正在尝试学习函数式 Swift 并开始从 Project Euler 做一些练习 甚至斐波那契数列 问题2 斐波那契数列中的每一项新项都是通过添加前两项而生成的 从 1 和 2 开始 前 10 项将是 1 2 3 5 8 13 21 34
  • 删除R中的多个值

    我有一个大约有 14 000 行和 40 列的数据集 我试图删除数据集第一列中具有以下值的所有行 但是当我执行类似操作时 filter data set data set DMS rem rem lt c 02M177 02M267 02M
  • EJB 3.1 依赖注入失败

    我创建了一个无状态会话 bean 如下所示 WebServlet name ProductController urlPatterns ProductController public class ProductController ext
  • MS Teams 活动源通知不会发送到移动设备

    我已经成功实施了活动提要通知在我的 MS Teams 应用程序 选项卡 中 问题是 我在移动设备上没有收到它们 既没有推送通知 也没有活动源中的项目 Web 和桌面上的活动源填充了相同的项目 但移动设备上没有任何内容 Web 和桌面版本工作
  • 混乱的 CSV 会导致异常

    我想我发现了一个错误 或者也许不是 但 Super CSV 无法很好地处理 我正在使用 MapReader 解析包含 41 列的 CSV 文件 但是 我收到了 CSV 并且为我提供 CSV 的 Web 服务弄乱了一行 标题 行是一个制表符分