Caf*_*der 6 java csv list opencsv writetofile
我必须使用打开的 csv 将嵌套的对象列表(StoreLocations)写入 Csv 文件。我的模型类是-
public class StoreLocation {
private String name;
private String city;
private int zip;
private String streetAndNumber;
private List<String> keywords;
private Double lat;
private Double lng;
private List<OpeningHours> openingHours;
}
public class OpeningHours {
private String dayOfWeek;
private String from1;
private String to1;
}
Run Code Online (Sandbox Code Playgroud)
我的写作方法——
public void getStoreLocationData(List<StoreLocation> storeLocations) throws IOException, CsvDataTypeMismatchException, CsvRequiredFieldEmptyException {
try (
Writer writer = Files.newBufferedWriter(Paths.get(storeLocationDataCsv))
) {
StatefulBeanToCsv beanToCsv = new StatefulBeanToCsvBuilder(writer)
.withQuotechar(CSVWriter.NO_QUOTE_CHARACTER)
.build();
beanToCsv.write(storeLocations);
}
}
Run Code Online (Sandbox Code Playgroud)
此代码完美生成所有列,除了开放时间列表。这是当前的输出-
我宁愿有一个开放时间列,并将每个开放时间安排为一个新行。就像是
或在营业时间列内的 json 列表中包含所有营业时间。可能我需要 columnPositionMappingStrategy 来设置这些列,但我需要知道如何使用它?
这是数组位置列表的 json 表示 -
[{
"name":"OBI Markt Kempen",
"city":"Kempen",
"zip":47906,
"streetAndNumber":"Kleinbahnstraße 32",
"keywords":[],
"lat":51.3740233,
"lng":6.4182039,
"openingHours":
[{"dayOfWeek":"1","from1":"08:00","to1":"20:00"},
{"dayOfWeek":"2","from1":"08:00","to1":"20:00"},
]}]
Run Code Online (Sandbox Code Playgroud)
注意:我尝试使用 super csv () 将解析 CSV引用到OpenCSV 的多个/嵌套 bean 类型?,bur 它变得非常复杂,而且我不明白如何将它写入文件。
此外,我已经通过 stackoverflow 将所有用于将复杂/嵌套的 java 对象写入 csv 的文章都引用了。
小智 0
public class CustomMappingStrategy<T> extends ColumnPositionMappingStrategy<T> {
public String[] generateHeader() {
return new String[]{"name","city","zip",
"streetAndNumber" ,"keywords","lat","lon","openingHrs_dayOfWeek","openingHrs_froml","openingHrs_to1"
};
}
//override transmuteBean or toString() in StoreLocation
@Override
public String[] transmuteBean(T bean) {
// Override this method to handle nested objects
if (bean instanceof StoreLocation ) {
return toStringArray((StoreLocation) bean);
} else {
return new String[0];
}
}
public String[] toStringArray(StoreLocation storeLocation) {
return new String[] {
String.valueOf(storeLocation.getName()),
String.valueOf(storeLocation.getCity()),
String.valueOf(storeLocation.getZip()),
String.valueOf(storeLocation.getStreeAndNumber()),
String.valueOf(storeLocation.getKeyWords().toString()),
String.valueOf(storeLocation.getLat()),
String.valueOf(storeLocation.getLon()),
List<OpeningHours> openingHours = storeLocation.getOpeningHrs();
for(OpeningHours obj: openingHours)
{
String.valueOf(obj.getDayOfWeek()),
String.valueOf(obj.getFrom1()),
String.valueOf(obj.getTo1()),
}
};
}
}
//use above strategy
public void getStoreLocationData(List<StoreLocation> storeLocations) throws IOException, CsvDataTypeMismatchException, CsvRequiredFieldEmptyException {
CustomMappingStrategy<StoreLocation> strategy = new CustomMappingStrategy<>();
String[] headers=strategy.generateHeader();
strategy.setType(StoreLocation.class);
strategy.setColumnMapping(headers);
try (
Writer writer = Files.newBufferedWriter(Paths.get(storeLocationDataCsv))
) {
StatefulBeanToCsv beanToCsv = new StatefulBeanToCsvBuilder(writer)
.withMappingStrategy(mappingStrategy)
.withQuotechar(CSVWriter.NO_QUOTE_CHARACTER)
.build();
beanToCsv.write(storeLocations);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1833 次 |
| 最近记录: |