我正在迭代csv文件并通过标头提取数据。但我想允许尾随空格并仍然识别标题。
例如,Header1,Header2,Header3
仍应被识别为Header1 ,Header2,Header3
我的代码......
final Reader in = new BufferedReader(new InputStreamReader(csv));
for (CSVRecord record : CSVFormat.EXCEL.withHeader().parse(in)) {
try {
final MyObject mo = new MyObject();
mo.setHeader1(record.get("Header1"));
mo.setHeader2(record.get("Header2"));
mo.setHeader3(record.get("Header3"));
....
}catch(){
....
}
}
但是这当然只会找到Header1
,如果它完全匹配(没有尾随空格)。
我无法找到像record.getIgnoreSpace()
这样的方法
答案 0 :(得分:2)
如果将使用CSVParser
构造的CSVFormat.EXCEL.withHeader().parse(in)
对象存储到变量中,则可以使用方法getHeaderMap()
查找所需标题的索引。然后可以使用这些索引而不是标题名称来查找字段(这实际上也是执行查找的更有效方式)。
一种方法是这样的:
CSVParser parser = CSVFormat.EXCEL.withHeader().parse(in);
Map<String, Integer> headerMap = parser.getHeaderMap();
int header1Index = -1;
int header2Index = -1;
for (Map.Entry<String, Integer> entry : headerMap.entrySet()) {
String name = entry.getKey();
int index = entry.getValue();
switch (name.trim()) {
case "Header1":
header1Index = index;
break;
case "Header2":
header2Index = index;
break;
}
}
for (CSVRecord record : parser) {
...
mo.setHeader1(record.get(header1Index));
...
}
答案 1 :(得分:0)
以下功能可以用作record.getIgnoreSpace():
getRecordTrimmedLookup(headerMap,csvRecord,“ Header1”);
try(Reader reader = new BufferedReader(new InputStreamReader(new FileInputStream(inputFile)));
CSVParser csvParser = new CSVParser(reader, CSVFormat.DEFAULT
.withIgnoreEmptyLines() //Not Mandatory
.withIgnoreHeaderCase() //Not Mandatory
.withFirstRecordAsHeader() //Not Mandatory
.withIgnoreSurroundingSpaces());) //Not Mandatory
{
Map<String, Integer> headerMap = parser.getHeaderMap();
System.out.println(getRecordTrimmedLookup(headerMap, csvRecord, "Header1"));
}
getRecordTrimmedLookup可以定义为:
private String getRecordTrimmedLookup(Map<String, Integer> headerMap, CSVRecord csvRecord, String columnName) {
for (Map.Entry<String, Integer> entry : headerMap.entrySet())
{
String name = entry.getKey();
int index = entry.getValue();
if(StringUtils.equalsIgnoreCase(StringUtils.trimToEmpty(name), StringUtils.trimToEmpty(columnName)))
{
return csvRecord.get(index);
}
}
return csvRecord.get(columnName);
}
注意:StringUtils是在here中找到的org.apache.commons:commons-lang3库。 希望这个答案对某人有帮助!
答案 2 :(得分:0)
我使用以下代码设法忽略了标头名称(之间)中的空格-通过使用get(index)而不是get(“ header_name”)。而且,当检测到空白值/行时,请停止读取csv:
CSVParser csvParser = CSVFormat.EXCEL.withFirstRecordAsHeader().parse(br);
for (CSVRecord record : csvParser) {
String number= record.get(0);
String date = record.get("date");
String location = record.get("Location");
String lsFile = record.get(3);
String docName = record.get(4);
if(StringUtils.isEmpty(lsFile)) {
break;
}
}