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

在Java中解析CSV文件时的问题

魏元白
2023-03-14

在这段代码中,目标是解析一个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:/Users/user/Desktop/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();

当我尝试实现此代码时,我在箭头标记的行处出现两个错误。

线程"main"中的异常java.lang.错误:未解决的编译问题:

列表类型中的方法 add(Country) 不适用于参数 (对象)

CsvToBean类型中的方法进程行(Mapping战略, String[])不可见

有人知道如何解决这个问题吗?我对Java相当陌生。

非常感谢你。

共有3个答案

宋原
2023-03-14

使用我在您之前的帖子中指出的CSVToBeanFilter,它应该可以解决您的问题。

慕阳伯
2023-03-14

一种解决方案应该是将响应从流程线向下传递到国家,如下所示:

list.add(csv.processLine(strat,row));to list . add((Country)CSV . process line(strat,row));< br >

但是你的第二个问题,关于方法可见性,表明你没有使用库的公共API。< br >请阅读该库的文档和示例,以了解如何使用它。

濮阳默
2023-03-14

来自 CsvToBean 类型的方法 processLine(MappingStrategy, String[]) 不可见

意味着该方法必须是可访问的(可能的原因;它是私有的、受保护的或友好的),因此使用公共的

类型List中的add(国家)方法不适用于参数(对象)

并且必须返回类型country,方法签名必须类似;

public Country processLine(ColumnPositionMappingStrategy strat, String [] row)
 类似资料:
  • 问题内容: 应用启动时,我需要将数据预加载到tableView中。所以我通过解析.csv文件来使用核心数据。为此,我正在关注本教程。这是我的parseCSV函数 这是我的示例.csv文件 但我在这条线上出现错误 致命错误:数组索引超出范围 我究竟做错了什么 ?请帮我。 问题答案: 您正在尝试解析文件路径而不是文件内容。 如果您更换 与: 那么代码将适用于您的示例文件。

  • 我有一个需要使用CSVREAD导入的csv文件。问题是它以不同的方式具有日期时间格式,因此需要解析it.Can有人给我一个我应该如何做的例子吗? 我尝试:合并到消息(MESG_DATE_FROMMESG_DATE_TOMESG_DISPLAY_SEQMESG_TIME_DELAYMESG_IDREASONTYPE_MAJOR)选择*from CSVREAD('MESSAGE_0.csv'); 这些

  • 我有一个带有注释的csv文件,其值需要在两个ArrayList之间拆分。例如: 实现这一目标的最佳方式是什么?我是否应该使用一个计数器,每次状态从%变到某个值时递增,反之亦然,然后如果计数器% 2 = 0,那么添加一个新的ArrayList并开始写入它?这是我能想到的唯一办法,但似乎有点笨拙,还有人有更好的主意吗? 编辑:我已经写了实际解析csv值的代码,我不需要帮助,只是想知道如何将值分成两个列

  • 问题内容: 我正在研究一个很长的Bash脚本。我想将CSV文件中的单元格读取到Bash变量中。我可以解析行和第一列,但不能解析其他任何列。到目前为止,这是我的代码: 它仅打印第一列。作为附加测试,我尝试了以下操作: $ y是空的。所以我尝试了: $ y是。为什么? 问题答案: 您需要使用而不是: 请注意,对于一般用途的CSV解析,您应该使用专门的工具,该工具可以处理带有内部逗号的带引号的字段,以及

  • 我试图从一个csv文件(excel)中读取和解析时间,但由于excel的移除前导零的特性,时间有不同的格式。像这样: 09:05:28这样的时间在Excel中变成了9:05:28,不能和14:37:38格式一起解析。 提前道谢。

  • 问题内容: 我正在解析CSV文件,但是最后一行的最后9列为空,只有一行,并且用逗号分隔的字符串会忽略其余的空列。 这是演示此代码的代码: 列的大小为20,应为29。任何想法? 问题答案: 查看有关以下内容的文档: 该方法的工作方式就像通过调用带有给定表达式且限制参数为零的二参数拆分方法。因此,结尾的空字符串不包括在结果数组中。 因此,您需要查看其他方法的选项 limit参数控制应用图案的次数,因此