From a40b6b42041cd1de43a777687a3404fa79617e80 Mon Sep 17 00:00:00 2001 From: jaysunxiao Date: Sun, 24 Aug 2025 20:17:00 +0800 Subject: [PATCH] feat: csv convert to object and array to csv --- .../java/com/zfoo/protocol/util/CsvUtils.java | 54 +++++++++++++++---- 1 file changed, 43 insertions(+), 11 deletions(-) diff --git a/protocol/src/main/java/com/zfoo/protocol/util/CsvUtils.java b/protocol/src/main/java/com/zfoo/protocol/util/CsvUtils.java index 14340500..3c7a8325 100644 --- a/protocol/src/main/java/com/zfoo/protocol/util/CsvUtils.java +++ b/protocol/src/main/java/com/zfoo/protocol/util/CsvUtils.java @@ -11,25 +11,22 @@ */ package com.zfoo.protocol.util; +import com.zfoo.protocol.collection.ArrayUtils; +import com.zfoo.protocol.collection.CollectionUtils; + import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; +import java.util.stream.Collectors; /** * @author jaysunxiao */ public class CsvUtils { - /** - * CSV 字符串转对象列表 - * - * @param csv CSV 格式字符串,第一行是表头 - * @param clazz 目标类 - * @param 泛型类型 - * @return 对象列表 - */ - public static List parse(String csv, Class clazz) { + + public static List toList(String csv, Class clazz) { if (StringUtils.isEmpty(csv)) { return Collections.emptyList(); } @@ -40,7 +37,7 @@ public class CsvUtils { } var result = new ArrayList(); - // 第一行作为表头 + // first line as header var headers = lines[0].split(StringUtils.COMMA_REGEX); var headerIndex = new HashMap(); for (var i = 0; i < headers.length; i++) { @@ -49,7 +46,7 @@ public class CsvUtils { var fields = ReflectionUtils.notStaticAndTransientFields(clazz); fields.forEach(it -> ReflectionUtils.makeAccessible(it)); - // 从第二行开始解析 + // next line from second line is data for (var i = 1; i < lines.length; i++) { var values = lines[i].split(StringUtils.COMMA_REGEX); @@ -70,4 +67,39 @@ public class CsvUtils { return result; } + public static T[] toArray(String csv, Class clazz) { + return ArrayUtils.listToArray(toList(csv, clazz), clazz); + } + + + public static String toCsv(List list) { + if (CollectionUtils.isEmpty(list)) { + return StringUtils.EMPTY; + } + + var builder = new StringBuilder(); + + // header + var clazz = list.get(0).getClass(); + var fields = ReflectionUtils.notStaticAndTransientFields(clazz); + fields.forEach(it -> ReflectionUtils.makeAccessible(it)); + + var headers = fields.stream().map(it -> it.getName()).collect(Collectors.joining(StringUtils.COMMA_REGEX)); + builder.append(headers).append(FileUtils.LS); + + // data row + for (T obj : list) { + var row = fields.stream() + .map(it -> ReflectionUtils.getField(it, obj)) + .map(it -> it.toString()) + .collect(Collectors.joining(StringUtils.COMMA_REGEX)); + builder.append(row).append(FileUtils.LS); + } + + return builder.toString(); + } + + public static String toCsv(T[] array) { + return toCsv(ArrayUtils.toList(array)); + } }