在忽略尾随空格的同时读取CSV记录

时间:2016-09-08 15:03:54

标签: java apache-poi

我正在迭代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()这样的方法

3 个答案:

答案 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;
                 }
          }