当前位置: 首页 > 面试题库 >

CSV混乱会导致异常

拓拔泉
2023-03-14
问题内容

我想我发现了一个错误。也许不是,但是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开发人员,我将研究在网站上创建一些异常处理示例。

您可以保持简单,并使用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();
    }
}

输出:

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

如果您担心使用Super CSV的Util类(可能会更改-
这实际上是一个内部实用程序类),则可以像我在这里建议的那样组合2个阅读器。

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



 类似资料:
  • 我有一个填充了应该包含一些对象的文本。图像可能比正常线高,这会导致以下问题: 如果图像是一行的最后一个对象,则以下行的高度正确 如果最后一个对象不是图像,则以下行的高度设置为包含图像的行的高度 更有趣的是,如果文本中有一个新的行字符,那么从那一点开始,行的高度也是好的。 只是一个非常基本的: (位于中,后者位于中。)

  • 问题内容: 我在名为bot4CA.py的模块上使用cProfile,因此在控制台中键入: 模块运行并退出后,它将创建一个名为Thing.txt的文件,当我打开它时,那里有一些信息,其余的是一堆字符,而不是我想要的整齐的数据文件。有没有人知道如何使用cProfile并最终得到整齐有序的数据表,就像在命令行中正常使用时一样(除了在文件中)?这是.txt文件中某些数据的示例: 我真正想要的是,当您调用c

  • 以下操作会在运行时导致异常: java.lang.VerifyError:操作数堆栈上的类型错误异常详细信息:location:com/sun/net/httpserver/spi/httpserverprovider$1.run()ljava/lang/object;@27:invokestatic原因:类型“sun/net/httpserver/defaulthttpserverprovide

  • 我正在尝试实现View.OnClickListener接口和GoogleApiclient如下 但这失败了,错误如下 错误:任务': app: dexDebug'执行失败。com.android.ide.common.process.ProcessException:org.gradle.process.internal.ExecException: Process'命令'C:\Program F

  • 应用程序可以持久化用户,以后可以修改。最近无法修改用户,引发了异常。用户实体被持久化,没有错误或验证。有人知道是什么导致了这种行为,或者我如何找到更多细节吗?

  • (2016.3.15更新) 上周我遇到了一个奇怪的问题,我想和你讨论一下这个问题。 但是,如果我使用sendMessage(SearchHandler.Object...)而不是runOnUiThread,一切都会很顺利!! java: SearchActivity.java: 2)在运行getActivity().runonuithread()之前,首先判断getActivity()==null