【问题标题】:How to alias prefixed CSV columns to a Map with SimpleFlatMapper?如何使用 SimpleFlatMapper 将前缀 CSV 列别名为 Map?
【发布时间】:2019-08-27 17:23:34
【问题描述】:

背景

使用 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”。

尝试解决问题

.addColumnProperty(
    col -> col.getName().startsWith("pf."),
    MapTypeProperty.KEY_VALUE)
  • .addAlias 只接受 String 参数,所以这样的东西不起作用:
.addAlias("pf.", "prefixedFields")

【问题讨论】:

    标签: java csv simpleflatmapper


    【解决方案1】:

    A comment on a GitHub issue from the project owner 让我走上了正轨。

    addColumnProperty 接受 Object 的可变参数。您可以传入RenameProperty,它接受String 参数用于简单的列重命名或Function&lt;String, String&gt; 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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-18
      • 2016-03-07
      • 2018-12-20
      • 2010-09-17
      • 1970-01-01
      • 2013-01-30
      相关资源
      最近更新 更多