如何使用 SimpleFlatMapper 将带前缀的 CSV 列别名为 Map?
How to alias prefixed CSV columns to a Map with SimpleFlatMapper?
背景
使用 SimpleFlatMapper sfm-csv 6.0.3
CSV 示例:
|------|-------------|----------------|----------------|------------------|
| name | reference # | pf.first thing | pf.secondThing | pf.another.thing |
|======|=============|================|================|==================|
| foo | eb2e23c0d6a | a value here | | another value |
|------|-------------|----------------|----------------|------------------|
| bar | 0a4bba4c1d0 | values | all | throughout |
|------|-------------|----------------|----------------|------------------|
波乔
class Item {
private String name;
private String reference;
private Map<String, String> prefixedFields;
// ... builder, getters, etc.
}
简化代码
final CsvMapper<Item> mapper = CsvMapperFactory.newInstance()
.addAlias("name", "itemName")
.addAlias("reference #", "reference")
.newMapper(Item.class);
return CsvParser.mapWith(mapper)
.stream(file, items -> items.collect(List.collector()));
问题
原样,Map
即将回归 null
。我正在努力达到这样的程度:
firstRowItem.getPrefixedFields() == ImmutableMap.of(
"first thing", "a value here",
"another.thing", "another value")
secondRowItem.getPrefixedFields() == ImmutableMap.of(
"first thing", "values",
"secondThing", "all",
"another.thing", "throughout")
“pf”。前缀是固定的,如果 属性 被命名为 "pf":
一切正常
class Item {
// ...
private Map<String, String> pf;
// ...
}
但我希望将 属性 命名为“prefixedFields”而不是“pf”。
尝试解决
- SimpleFlatMapper docs on property mapping 显示如何匹配“pf”。前缀,但不包括别名
Map
:
.addColumnProperty(
col -> col.getName().startsWith("pf."),
MapTypeProperty.KEY_VALUE)
.addAlias
只接受 String
参数,所以这样的东西不起作用:
.addAlias("pf.", "prefixedFields")
A comment on a GitHub issue from the project owner 让我走上了正确的轨道。
addColumnProperty
接受 Object
的可变参数。您可以传入 RenameProperty
,它接受用于简单列重命名的 String
参数或 Function<String, String> renameFunction
。像这样把它们放在一起:
final CsvMapper<Item> mapper = CsvMapperFactory.newInstance()
.addAlias("name", "itemName")
.addAlias("reference #", "reference")
.addColumnProperty(
column -> column.getName().startsWith("pf."),
new RenameProperty(columnName -> columnName.replace("pf.", "prefixedFields_")))
.newMapper(Item.class);
背景
使用 SimpleFlatMapper sfm-csv 6.0.3
CSV 示例:
|------|-------------|----------------|----------------|------------------|
| name | reference # | pf.first thing | pf.secondThing | pf.another.thing |
|======|=============|================|================|==================|
| foo | eb2e23c0d6a | a value here | | another value |
|------|-------------|----------------|----------------|------------------|
| bar | 0a4bba4c1d0 | values | all | throughout |
|------|-------------|----------------|----------------|------------------|
波乔
class Item {
private String name;
private String reference;
private Map<String, String> prefixedFields;
// ... builder, getters, etc.
}
简化代码
final CsvMapper<Item> mapper = CsvMapperFactory.newInstance()
.addAlias("name", "itemName")
.addAlias("reference #", "reference")
.newMapper(Item.class);
return CsvParser.mapWith(mapper)
.stream(file, items -> items.collect(List.collector()));
问题
原样,Map
即将回归 null
。我正在努力达到这样的程度:
firstRowItem.getPrefixedFields() == ImmutableMap.of(
"first thing", "a value here",
"another.thing", "another value")
secondRowItem.getPrefixedFields() == ImmutableMap.of(
"first thing", "values",
"secondThing", "all",
"another.thing", "throughout")
“pf”。前缀是固定的,如果 属性 被命名为 "pf":
一切正常class Item {
// ...
private Map<String, String> pf;
// ...
}
但我希望将 属性 命名为“prefixedFields”而不是“pf”。
尝试解决
- SimpleFlatMapper docs on property mapping 显示如何匹配“pf”。前缀,但不包括别名
Map
:
.addColumnProperty(
col -> col.getName().startsWith("pf."),
MapTypeProperty.KEY_VALUE)
.addAlias
只接受String
参数,所以这样的东西不起作用:
.addAlias("pf.", "prefixedFields")
A comment on a GitHub issue from the project owner 让我走上了正确的轨道。
addColumnProperty
接受 Object
的可变参数。您可以传入 RenameProperty
,它接受用于简单列重命名的 String
参数或 Function<String, String> renameFunction
。像这样把它们放在一起:
final CsvMapper<Item> mapper = CsvMapperFactory.newInstance()
.addAlias("name", "itemName")
.addAlias("reference #", "reference")
.addColumnProperty(
column -> column.getName().startsWith("pf."),
new RenameProperty(columnName -> columnName.replace("pf.", "prefixedFields_")))
.newMapper(Item.class);