在解析 .csv
文件时,我遍历文件的列标题并查看其中一个是否等于(忽略大小写)比较 id
:
String comparand = "id";
for (String header : headerMap.keySet()) {
if (header.equalsIgnoreCase(comparand)) {
recordMap.put("_id", csvRecord.get(header));
} else {
recordMap.put(header, csvRecord.get(header));
}
}
使用 UTF-8
字符集读取文件:
Reader reader = new InputStreamReader(file.getInputStream(), StandardCharsets.UTF_8);
我使用的 CSV 解析器库是 Apache Commons CSV :
CSVParser csvParser = CSVFormat.DEFAULT
.withDelimiter(delimiter)
.withFirstRecordAsHeader()
.withIgnoreEmptyLines()
.parse(reader);
Map<String, Integer> headerMap = csvParser.getHeaderMap();
上面的 equalsIgnoreCase()
计算结果为 false
而两个字符串的值都是 id
。
观察调试器显示 header
值是一个非紧凑字符串 (UTF-16) 而 comparand
值是 compact string (ASCII):
这是默认行为还是错误?我怎样才能使 equalsIgnoreCase
像人们期望的那样评估为 true
?
最佳答案
您的 header
值以 UTF-16 BOM FFFE
开头.读取 header
时剥离 BOM,然后再与 comparand
进行比较。
关于具有非紧凑字符串的 Java 紧凑字符串 equalsIgnoreCase 计算结果为 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55101214/