Beschreiben Sie das Programm, das als verwendete Bibliothek angesehen wurde, da ein CSV-Format erstellt werden musste, mit dem Ausgabefelder nach mehrzeiligem Header und Feldnamen gefiltert werden können.
2.CsvMapper/CsvSchema
Mit der Jackson-Bibliothek (jackson-dataformat-csv) können Sie ein Objekt (json) problemlos in csv konvertieren. Diesmal habe ich das benutzt.
// getter/Setter ist erforderlich, aber weggelassen
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) {
//Fehlerbehandlung (vorläufig)
e.printStackTrace();
}
[Ausgabe]
field1,field2,field3
aaa,,ccc
Sie können auch Folgendes tun
CsvMapper mapper = new CsvMapper();
CsvSchema schema = mapper.schemaFor(TestObj.class).withHeader().withNullValue("<empty>");
[Ausgabe]
field1,field2,field3
aaa,<empty>,ccc
CsvMapper mapper = new CsvMapper();
CsvSchema schema = mapper.schemaFor(TestObj.class).withHeader().withLineSeparator("|");
[Ausgabe]
"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();
[Ausgabe]
field1,field2,field3
aaa,,ccc
aaa,,ccc
aaa,,ccc
Es ist zu beachten, dass die folgenden Änderungen an verschachtelten Objekten nicht unterstützt werden.
//Kann in CSV konvertiert werden
class TestObj {
private String field1 = "aaa";
private String field2 = "bbb";
private String field3 = "ccc";
}
//Kann nicht in CSV konvertiert werden
class TestObj2 {
TestObj obj = new TestObj();
private String field4 = "aaa";
}
Erstellen Sie etwas, das den Feldnamen und den Typnamen des Objekts als Überschriften ausgibt (2 Zeilen).
Leider unterstützt Jackson nicht mehrere Header und Filter, deshalb habe ich es selbst erstellt.
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);
//Zu filterndes Feld (ursprünglich externer Eingang)
List<String> filterParam = new ArrayList<String>() {
{
add("field1");
add("field3");
}
};
//Erstellen Sie mehrere Header und Filter
String header = createHeader(obj, filterParam, fields);
List<String> bodies = new ArrayList<>();
try {
bodies = Arrays.asList(mapper.writer(schema).writeValueAsString(obj).split(","));
} catch (JsonProcessingException e) {
//Fehlerbehandlung (vorläufig)
e.printStackTrace();
}
String body = filter(bodies, filterParam, fields);
//Ursprünglich verbunden und zurückgegeben
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(","));
}
[Ausgabeergebnis]
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()
Verschiedene Möglichkeiten zum Verketten von durch Kommas getrennten Zeichenfolgen in Java https://qiita.com/shisama/items/b27d16b3aeb1baf055b1
String-Verkettung in Java 8 https://qiita.com/lonerydeveloper/items/9f7c977c039ad4d24d30
Recommended Posts