当前位置: 首页 > 知识库问答 >
问题:

使用OpenCSV只能部分解析CSV文件

宋铭
2023-03-14

我有一个CSV文件,我想用开放CSV的csv阅读器在Java中解析。

为此,我创建了一个Bean对象,信息映射到该对象。我的有点长,所以这是我从教程中得到的一个例子:

package net.viralpatel.java;

public class Country {
    private String countryName;
    private String capital;

    public String getCountryName() {
    return countryName;
    }

    public void setCountryName(String countryName) {
        this.countryName = countryName;
    }

    public String getCapital() {
        return capital;
    }

    public void setCapital(String capital) {
        this.capital = capital;
    }
}

我用来解析CSV文件并将信息映射到bean的代码类似于以下代码:

ColumnPositionMappingStrategy strat = new ColumnPositionMappingStrategy();
strat.setType(Country.class);
String[] columns = new String[] {"countryName", "capital"};
strat.setColumnMapping(columns);

CsvToBean csv = new CsvToBean();

String csvFilename = "C:\\sample.csv";
CSVReader csvReader = new CSVReader(new FileReader(csvFilename));

List list = csv.parse(strat, csvReader);

问题在于,我的CSV不仅包含原始数据,还包含列标题和其他数据。对于专栏标题,我只从某行读取我的文件,解决了这个问题:

CSVReader csvReader = new CSVReader(new FileReader(csvFilename), ';', '\'', 1);

(1 是开始读取的行)

其他数据主要是文件末尾(例如)整数列中的字符串。

例如,我有一个包含整数信息的“最大速度”列,紧挨着一个包含整数信息的“距离”列。但是在“距离”栏的末尾是总距离,所以字符串“总:”就在它旁边的“最大速度”栏中。

我该怎么做才能确保读者忽略最后几行,只读取上面的原始信息?

PS:我看的CSV文件长度不一。所以说“在X行之后停止阅读”不会起作用。另一方面,“附录”行总是相同的。所以说“在文件结束前停止读两行”应该可以。

非常感谢您的帮助。

共有2个答案

公冶峰
2023-03-14

如果您使用的是较新版本的opencsv,则将CsvToBeanFilter注入到您的CSVtoBean类中。opencsv javadoc提供了一个如何创建过滤器的优秀示例。对于您的示例,您只需创建一个过滤器,如果最大速度为null、空或“total:”,则其allowLine方法将返回false:

李奕
2023-03-14

您可以始终下降到较低级别并在将其映射到bean之前检查原始字符串数组,如下所示:

ColumnPositionMappingStrategy<Country> strat = new ColumnPositionMappingStrategy<Country>();
    strat.setType(Country.class);
    String[] columns = new String[] {"countryName", "capital"};
    strat.setColumnMapping(columns);

    PublicProcessLineCsvToBean<Country> csv = new PublicProcessLineCsvToBean<Country>();

    String csvFilename = "C:\\sample.csv";
    CSVReader csvReader = new CSVReader(new FileReader(csvFilename));
    List<Country> list = new ArrayList<Country>();

    String [] row = csvReader.readNext(); //skip header
    if(row == null) throw new RuntimeException("File is empty");
    row = csvReader.readNext();
    String [] nextRow = csvReader.readNext();
    while(row != null) {
        if(nextRow == null) break; //check what 'row' is last
        if("Total:".equalsIgnoreCase(row[1])) break; //check column for special strings

        list.add(csv.processLine(strat, row));

        row = nextRow;
        nextRow = csvReader.readNext();
    }

并使工艺线公开:

public static class PublicProcessLineCsvToBean<T> extends CsvToBean<T> {

        @Override
        public T processLine(MappingStrategy<T> mapper, String[] line) throws IllegalAccessException, InvocationTargetException, InstantiationException, IntrospectionException {
            return super.processLine(mapper, line);
        }
    }
 类似资料:
  • 问题内容: 我正在尝试在NetBeans 6.0.1中使用OpenCSV解析.csv文件。我的文件包含一些Unicode字符。当我在输出中写入字符时,字符以其他形式显示,例如(HJ1’-E /;)。当我在记事本中打开此文件时,它看起来还可以。 我使用的代码: 问题答案: 首先,您需要知道文件的编码格式,例如UTF-8或UTF-16。生成此文件的原因是什么? 在那之后,它相对简单- 您需要创建一个包

  • 我正在使用OpenCsv为我的Android应用程序解析.csv文件。我用 kotlin 编写代码。这是我的代码: 我是这样解析csv文件的: 这是我要将csv数据转换为的对象类。 } 我已经在build.gradle文件中添加了这一行: 这是我的csv文件内容: G T,11111 11111 H K,2222222222 KK,33333 33333 P K,44444 44444 但是当我运

  • 我正在尝试使用OpenCsv从CSV解析即时,如下所示: 我知道OpenCsv应该支持< code>java.time。 但是当我试图使用它的时候,我得到了下面的异常: 分析CSV行时出错:8。 ... 原因:java.time.format。DateTimeParseException:无法解析文本“2022-04-21 00:00:00”:无法从临时加速器获取即时数据:{HourOfAmPm=

  • 我试图使用opencsv 3.3与一些用户解析一个简单的csv文件并将其放入bean中,但在运行代码时得到一个类未找到异常。下面是我用于读取对象的Person.class文件。 读取 csv 的代码如下。 当我运行这个时,它表示没有找到报头映射的类。你知道这个人是否有问题吗。类还是使用映射?如果您能提供任何帮助,我们将不胜感激。

  • 问题内容: 使用nodejs,我想解析一个包含10000条记录的.csv文件,并对每一行进行一些操作。我尝试使用http://www.adaltas.com/projects/node- csv 。我无法让它在每一行暂停。这只会读取所有10000条记录。我需要执行以下操作: 逐行读取csv 在每条线上执行耗时的操作 转到下一行 有人可以在这里提出其他建议吗? 问题答案: 好像您需要使用一些基于流的

  • 使用nodejs,我想解析一个包含10000条记录的.csv文件,并对每一行执行一些操作。我尝试使用http://www.adaltas.com/projects/node-csv。我不能让它每排都停下来。这只是读取所有的10000个记录。我需要做到以下几点: 逐行读取csv 对每行执行耗时操作 转到下一行