Skip to content

Commit a40b6b4

Browse files
committed
feat: csv convert to object and array to csv
1 parent 7258e12 commit a40b6b4

File tree

1 file changed

+43
-11
lines changed

1 file changed

+43
-11
lines changed

protocol/src/main/java/com/zfoo/protocol/util/CsvUtils.java

Lines changed: 43 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,25 +11,22 @@
1111
*/
1212
package com.zfoo.protocol.util;
1313

14+
import com.zfoo.protocol.collection.ArrayUtils;
15+
import com.zfoo.protocol.collection.CollectionUtils;
16+
1417
import java.util.ArrayList;
1518
import java.util.Collections;
1619
import java.util.HashMap;
1720
import java.util.List;
21+
import java.util.stream.Collectors;
1822

1923
/**
2024
* @author jaysunxiao
2125
*/
2226
public class CsvUtils {
2327

24-
/**
25-
* CSV 字符串转对象列表
26-
*
27-
* @param csv CSV 格式字符串,第一行是表头
28-
* @param clazz 目标类
29-
* @param <T> 泛型类型
30-
* @return 对象列表
31-
*/
32-
public static <T> List<T> parse(String csv, Class<T> clazz) {
28+
29+
public static <T> List<T> toList(String csv, Class<T> clazz) {
3330
if (StringUtils.isEmpty(csv)) {
3431
return Collections.emptyList();
3532
}
@@ -40,7 +37,7 @@ public static <T> List<T> parse(String csv, Class<T> clazz) {
4037
}
4138

4239
var result = new ArrayList<T>();
43-
// 第一行作为表头
40+
// first line as header
4441
var headers = lines[0].split(StringUtils.COMMA_REGEX);
4542
var headerIndex = new HashMap<String, Integer>();
4643
for (var i = 0; i < headers.length; i++) {
@@ -49,7 +46,7 @@ public static <T> List<T> parse(String csv, Class<T> clazz) {
4946

5047
var fields = ReflectionUtils.notStaticAndTransientFields(clazz);
5148
fields.forEach(it -> ReflectionUtils.makeAccessible(it));
52-
// 从第二行开始解析
49+
// next line from second line is data
5350
for (var i = 1; i < lines.length; i++) {
5451
var values = lines[i].split(StringUtils.COMMA_REGEX);
5552

@@ -70,4 +67,39 @@ public static <T> List<T> parse(String csv, Class<T> clazz) {
7067
return result;
7168
}
7269

70+
public static <T> T[] toArray(String csv, Class<T> clazz) {
71+
return ArrayUtils.listToArray(toList(csv, clazz), clazz);
72+
}
73+
74+
75+
public static <T> String toCsv(List<T> list) {
76+
if (CollectionUtils.isEmpty(list)) {
77+
return StringUtils.EMPTY;
78+
}
79+
80+
var builder = new StringBuilder();
81+
82+
// header
83+
var clazz = list.get(0).getClass();
84+
var fields = ReflectionUtils.notStaticAndTransientFields(clazz);
85+
fields.forEach(it -> ReflectionUtils.makeAccessible(it));
86+
87+
var headers = fields.stream().map(it -> it.getName()).collect(Collectors.joining(StringUtils.COMMA_REGEX));
88+
builder.append(headers).append(FileUtils.LS);
89+
90+
// data row
91+
for (T obj : list) {
92+
var row = fields.stream()
93+
.map(it -> ReflectionUtils.getField(it, obj))
94+
.map(it -> it.toString())
95+
.collect(Collectors.joining(StringUtils.COMMA_REGEX));
96+
builder.append(row).append(FileUtils.LS);
97+
}
98+
99+
return builder.toString();
100+
}
101+
102+
public static <T> String toCsv(T[] array) {
103+
return toCsv(ArrayUtils.toList(array));
104+
}
73105
}

0 commit comments

Comments
 (0)