Java 如何验证CSV文件的第一行是否与标题名称匹配?

Java 如何验证CSV文件的第一行是否与标题名称匹配?,java,csv,apache-commons-csv,Java,Csv,Apache Commons Csv,我想处理这种结构的CSV文件: header1,header2 val1.1, val1.2 val2.1, val2.2 但仅当第一行包含两个标题名时,否则抛出异常 我当前使用的实现是: 问题在于,第一行的值可能与标题名不同,并且文件仍在处理中。指的是: 安全引用列 如果源代码包含标题记录,则可以使用不带参数的withHeader(String…)简化代码并安全地引用列: CSVFormat.EXCEL.withHeader(); 这会导致解析器读取第一条记录并将其值用作列名。然后,调用C

我想处理这种结构的CSV文件:

header1,header2
val1.1, val1.2
val2.1, val2.2
但仅当第一行包含两个标题名时,否则抛出异常

我当前使用的实现是:

问题在于,第一行的值可能与标题名不同,并且文件仍在处理中。

指的是:

安全引用列 如果源代码包含标题记录,则可以使用不带参数的withHeader(String…)简化代码并安全地引用列:

CSVFormat.EXCEL.withHeader();
这会导致解析器读取第一条记录并将其值用作列名。然后,调用CSVRecord get方法之一,该方法采用字符串列名参数:

String value=record.get(“Col1”);
这使您的代码不受CSV文件中列顺序更改的影响


所以,您可以按照这个步骤,使用第一行作为标题,然后验证标题

以下是一个简单的演示:

import java.io.IOException;
导入java.io.Reader;
导入java.io.StringReader;
导入java.util.ArrayList;
导入java.util.List;
导入org.apache.commons.csv.CSVFormat;
导入org.apache.commons.csv.CSVParser;
导入org.apache.commons.csv.CSVRecord;
公共类UseFirstRowAsHeader{
公共静态void main(字符串[]args)引发IOException{
字符串validHeaderCsv=“header1,header2\r\n”
+val1.1,val1.2\r\n
+“val2.1,val2.2”;
使用HeaderValidation解析(有效HeaderCSV);
字符串invalidHeaderCsv=“header1,header2,header3\r\n”
+val1.1,val1.2\r\n
+“val2.1,val2.2”;
使用HeaderValidation解析(无效HeaderCSV);
}
私有静态void parseWithHeaderValidation(字符串validHeaderCsv)引发IOException{
读卡器=新的StringReader(validHeaderCsv);
List expectedHeaders=new ArrayList();
预期标题。添加(“标题1”);
预期标题。添加(“标题2”);
try(CSVParser CSVParser=new CSVParser(reader,CSVFormat.DEFAULT
.withHeader().withAllowMissingColumnNames(false)
.withSkipHeaderRecord())){
如果(!csvParser.getHeaderNames().equals(expectedHeaders)){
抛出新的IllegalStateException(“非预期标头”+csvParser.getHeaderNames());
}
用于(CSVRecord CSVRecord:csvParser){
System.out.println(csvRecord.get(“header1”)+,“+csvRecord.get(“header2”));
}
}
}
}

reference:,您仍将跳过标题记录。问题是我不想将标题作为记录处理,但我想确保它们具有我想要的值。
Reader reader = new InputStreamReader(new ByteArrayInputStream(file.getContent()));

CSVParser csvParser = new CSVParser(reader, CSVFormat.DEFAULT
            .withHeader("header1", "header2")
            .withSkipHeaderRecord());

for (CSVRecord csvRecord : csvParser) { /* records processing */ }