Comme il était nécessaire de créer un format csv capable de filtrer les champs de sortie par en-tête multiligne et par nom de champ, décrivez le programme considéré comme la bibliothèque utilisée.
2.CsvMapper/CsvSchema
Vous pouvez facilement convertir un objet (json) en csv avec la bibliothèque Jackson (jackson-dataformat-csv). Je l'ai utilisé cette fois.
// getter/setter est obligatoire mais omis
class TestObj {
private String field1 = "aaa";
private String field2 = null;
private String field3 = "ccc";
}
TestObj obj = new TestObj();
CsvMapper mapper = new CsvMapper();
CsvSchema schema = mapper.schemaFor(TestObj.class).withHeader();
try {
System.out.println(mapper.writer(schema).writeValueAsString(obj));
} catch(JsonProcessingException e) {
//Traitement des erreurs (provisoire)
e.printStackTrace();
}
[production]
field1,field2,field3
aaa,,ccc
Vous pouvez également faire ce qui suit
CsvMapper mapper = new CsvMapper();
CsvSchema schema = mapper.schemaFor(TestObj.class).withHeader().withNullValue("<empty>");
[production]
field1,field2,field3
aaa,<empty>,ccc
CsvMapper mapper = new CsvMapper();
CsvSchema schema = mapper.schemaFor(TestObj.class).withHeader().withLineSeparator("|");
[production]
"field1","field2","field3"|"aaa",,"ccc"|
List<TestObj> objs = new ArrayList<TestObj>() {
{
add(new TestObj());
add(new TestObj());
add(new TestObj());
}
};
CsvMapper mapper = new CsvMapper();
CsvSchema schema = mapper.schemaFor(TestObj.class).withHeader();
[production]
field1,field2,field3
aaa,,ccc
aaa,,ccc
aaa,,ccc
Il convient de noter qu'il ne prend pas en charge les modifications suivantes apportées aux objets imbriqués.
//Peut être converti en csv
class TestObj {
private String field1 = "aaa";
private String field2 = "bbb";
private String field3 = "ccc";
}
//Ne peut pas être converti en csv
class TestObj2 {
TestObj obj = new TestObj();
private String field4 = "aaa";
}
Créez quelque chose qui affiche le nom du champ et le nom du type de l'objet sous forme d'en-têtes (2 lignes).
Malheureusement, jackson ne prend pas en charge plusieurs en-têtes et filtres, je l'ai donc créé moi-même.
public static void main(String[] args) {
TestObj obj = new TestObj();
List<Field> fields = Arrays.asList(obj.getClass().getDeclaredFields());
CsvMapper mapper = new CsvMapper();
CsvSchema schema = mapper.schemaFor(TestObj.class);
//Champ à filtrer (entrée externe à l'origine)
List<String> filterParam = new ArrayList<String>() {
{
add("field1");
add("field3");
}
};
//Créer plusieurs en-têtes et filtres
String header = createHeader(obj, filterParam, fields);
List<String> bodies = new ArrayList<>();
try {
bodies = Arrays.asList(mapper.writer(schema).writeValueAsString(obj).split(","));
} catch (JsonProcessingException e) {
//Traitement des erreurs (provisoire)
e.printStackTrace();
}
String body = filter(bodies, filterParam, fields);
//Initialement connecté et retourné
System.out.println(header);
System.out.println(body);
}
private static String createHeader(TestObj obj, List<String> param, List<Field> fields) {
String fieldHeader = fields.stream().filter(o -> param.contains(o.getName())).map(o -> o.getName
)
.collect(Collectors.joining(","));
String typeHeader = fields.stream().filter(o -> param.contains(o.getName())).map(o -> {
String typeName = o.getType().getName();
return typeName.substring(typeName.lastIndexOf(".") + 1, typeName.length());
}).collect(Collectors.joining(","));
return fieldHeader + "\n" + typeHeader;
}
private static String filter(List<String> bodies, List<String> param, List<Field> fields) {
if (param == null || param.isEmpty()) {
return bodies.stream().collect(Collectors.joining(","));
}
List<String> res = new ArrayList<>();
for (int i = 0; i < fields.size(); i++) {
String fieldName = fields.get(i).getName();
if (param.contains(fieldName)) {
res.add(bodies.get(i));
}
}
return res.stream().collect(Collectors.joining(","));
}
[Résultat de sortie]
field1,field3
String,String
aaa,ccc
CsvSchema http://fasterxml.github.io/jackson-dataformat-csv/javadoc/2.8/com/fasterxml/jackson/dataformat/csv/CsvSchema.html#withoutColumns()
Plusieurs façons de concaténer des chaînes séparées par des virgules en Java https://qiita.com/shisama/items/b27d16b3aeb1baf055b1
Concaténation de chaînes dans Java 8 https://qiita.com/lonerydeveloper/items/9f7c977c039ad4d24d30
Recommended Posts