Java-对象转CSV

x33g5p2x  于2022-06-30 转载在 Java  
字(7.7k)|赞(0)|评价(0)|浏览(511)

介绍

csv全称“Comma-Separated Values”,是一种逗号分隔值格式的文件,是一种用来存储数据的纯文本格式文件。CSV文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其它字符或字符串。

Java对象转CSV,有现成的工具包,commons-lang3ReflectionToStringBuilder 就可以简单的解决的对象转CSV 但是复杂点的处理还是不行,而且在运行速度上,我测试了下我自己写的,比这个快多了,1百万条数据大约也就2秒左右, 如果对速度有要求的话,我们可以使用多线程进行分割,比如1千万条数据,那么我开10个线程,1个线程执行100万条数据,所有线程执行完毕后在按照顺序拼接到一起,这样1千万条数据也就最多3~5秒执行完毕

代码样例

  1. package com.file.csv;
  2. import com.date.LocalDateUtils;
  3. import lombok.Data;
  4. import lombok.SneakyThrows;
  5. import java.lang.reflect.Field;
  6. import java.util.ArrayList;
  7. import java.util.Arrays;
  8. import java.util.List;
  9. import java.util.function.Function;
  10. /**
  11. * 对象转csv格式
  12. *
  13. * @describe
  14. * 1百万数据测试 2~3秒
  15. * 调用顺序如下(根据情况自行选择)
  16. * String s = ObjToCSV.create(userDatas)
  17. * .fieldsAll() //转换全部列
  18. * .addIncludeFields() //只包含某些列
  19. * .addExcludeFields("roleData") //排除某些列
  20. * .addHead() //添加头部字段
  21. * .addContent() //一个对象(一行)
  22. * .addContents() //多个对象(多行)
  23. * .addEnding((data)->{ //结尾说明
  24. * JSONObject jsonObject = new JSONObject();
  25. * jsonObject.put("count",data.getNumber());
  26. * jsonObject.put("time",data.getCreateDate());
  27. * return jsonObject.toJSONString();
  28. * })
  29. * .ToString(); //结果
  30. */
  31. @Data
  32. public class ObjToCSV<T> {
  33. private String separator = "\u0001|\u0001"; //默认分隔符
  34. private StringBuilder str = new StringBuilder();
  35. private T object;
  36. private List<T> objects;
  37. private List<String> excludeFields = new ArrayList<String>(100) {{
  38. add("serialVersionUID");
  39. }};
  40. private List<String> includeFields = new ArrayList<String>(100);
  41. private boolean fieldsAll = false;
  42. private int number;//多少行一共
  43. //日期串 20220617204504
  44. private String createDate=LocalDateUtils.getLocalDateTimeStr1() ;
  45. private ObjToCSV(T object, String separator) {
  46. this.object = object;
  47. this.separator = separator;
  48. //行数
  49. this.number=1;
  50. }
  51. private ObjToCSV(T object) {
  52. this.object = object;
  53. //行数
  54. this.number=1;
  55. }
  56. private ObjToCSV(List<T> objects) {
  57. if (objects.isEmpty()) {
  58. throw new NullPointerException("不能是空");
  59. }
  60. this.object = objects.get(0);
  61. this.objects = objects;
  62. //行数
  63. this.number=objects.size();
  64. }
  65. private ObjToCSV(List<T> objects, String separator) {
  66. if (objects.isEmpty()) {
  67. throw new NullPointerException("不能是空");
  68. }
  69. this.object = objects.get(0);
  70. this.objects = objects;
  71. this.separator = separator;
  72. //行数
  73. this.number=objects.size();
  74. }
  75. // 排除和包含都有,那么以包含的为主
  76. private boolean decideFields(String fieldName) {
  77. //包含
  78. if (includeFields.contains(fieldName)) {
  79. return false;
  80. }
  81. //排除
  82. if (excludeFields.contains(fieldName)) {
  83. return true;
  84. }
  85. // 开启全部放行
  86. if (fieldsAll) {
  87. return false;
  88. }
  89. //默认拦截全部
  90. return true;
  91. }
  92. public static <T> ObjToCSV<T> create(T object, String separator) {
  93. return new ObjToCSV<T>(object, separator);
  94. }
  95. public static <T> ObjToCSV<T> create(T object) {
  96. return new ObjToCSV<T>(object);
  97. }
  98. public static <T> ObjToCSV<T> create(List<T> object, String separator) {
  99. return new ObjToCSV<T>(object, separator);
  100. }
  101. public static <T> ObjToCSV<T> create(List<T> object) {
  102. return new ObjToCSV<T>(object);
  103. }
  104. //全部放行
  105. public ObjToCSV<T> fieldsAll() {
  106. fieldsAll = true;
  107. return this;
  108. }
  109. //包含
  110. public ObjToCSV<T> addIncludeFields(String... fieldName) {
  111. includeFields.addAll(Arrays.asList(fieldName));
  112. return this;
  113. }
  114. //排除
  115. public ObjToCSV<T> addExcludeFields(String... fieldName) {
  116. excludeFields.addAll(Arrays.asList(fieldName));
  117. return this;
  118. }
  119. //添加头部
  120. public ObjToCSV<T> addHead() {
  121. StringBuilder str1 = new StringBuilder();
  122. Class<?> aClass = this.object.getClass();
  123. Field[] fields = aClass.getDeclaredFields();
  124. int length = fields.length;
  125. for (int i = 0; i < length; i++) {
  126. Field field = fields[i];
  127. field.setAccessible(true);
  128. if (decideFields(field.getName())) {
  129. continue;
  130. }
  131. str1.append(field.getName()).append(separator);
  132. }
  133. int length1 = separator.length();
  134. String substring = str1.substring(0, str1.length() - length1);
  135. this.str.append(substring + "\n");
  136. return this;
  137. }
  138. //在结尾补充自定义的描述
  139. public ObjToCSV<T> addEnding(Function<ObjToCSV,String> functor){
  140. String apply = functor.apply( this);
  141. this.str.append(apply);
  142. return this;
  143. }
  144. //将对象转换为CSV格式字符串
  145. @SneakyThrows
  146. public ObjToCSV<T> addContent() {
  147. StringBuilder str1 = new StringBuilder();
  148. Class<?> aClass = this.object.getClass();
  149. Field[] fields = aClass.getDeclaredFields();
  150. int length = fields.length;
  151. for (int i = 0; i < length; i++) {
  152. Field field = fields[i];
  153. field.setAccessible(true);
  154. if (decideFields(field.getName())) {
  155. continue;
  156. }
  157. Object o = field.get(object);
  158. String value = "";
  159. if (o != null) {
  160. value = String.valueOf(o);
  161. }
  162. str1.append(value).append(separator);
  163. }
  164. int length1 = separator.length();
  165. String substring = str1.substring(0, str1.length() - length1);
  166. this.str.append(substring + "\n");
  167. return this;
  168. }
  169. //将多个对象转换为csv格式
  170. public ObjToCSV<T> addContents() {
  171. for (T t : this.objects) {
  172. this.object=t;
  173. addContent();
  174. }
  175. return this;
  176. }
  177. //将结果输出为字符串
  178. public String ToString() {
  179. return str.toString();
  180. }
  181. }

测试样例

  1. package com.file;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.data.RandomUserData;
  4. import com.entity.UserData;
  5. import com.file.csv.ObjToCSV;
  6. import com.file.csv.ObjToCSV;
  7. import com.function.impl.CodeStartAndStopTimeUtil;
  8. import lombok.SneakyThrows;
  9. import org.junit.Test;
  10. import java.util.List;
  11. public class ObjToCSVTest {
  12. //单个对象
  13. @Test
  14. public void show1(){
  15. UserData userOne = RandomUserData.getUserOne();
  16. String s = ObjToCSV.create(userOne)
  17. .fieldsAll()
  18. // .addIncludeFields()
  19. .addExcludeFields("roleData")
  20. // .addHead()
  21. .addContent()
  22. // .addContents()
  23. .addEnding((data)->{
  24. JSONObject jsonObject = new JSONObject();
  25. jsonObject.put("count",data.getNumber());
  26. jsonObject.put("time",data.getCreateDate());
  27. jsonObject.put("separator",data.getSeparator());
  28. return jsonObject.toJSONString();
  29. })
  30. .ToString();
  31. System.out.println(s);
  32. }
  33. //多个对象,可以使用自定义分隔符
  34. @Test
  35. public void show2(){
  36. UserData userOne = RandomUserData.getUserOne();
  37. String s = ObjToCSV.create(userOne,"|")
  38. .fieldsAll()
  39. .addExcludeFields("roleData")
  40. .addContent()
  41. .addEnding((data)->{
  42. JSONObject jsonObject = new JSONObject();
  43. jsonObject.put("count",data.getNumber());
  44. jsonObject.put("time",data.getCreateDate());
  45. jsonObject.put("separator",data.getSeparator());
  46. return jsonObject.toJSONString();
  47. })
  48. .ToString();
  49. System.out.println(s);
  50. }
  51. //排除不显示的,其他都显示
  52. @Test
  53. public void show3(){
  54. List<UserData> userDatas = RandomUserData.getUserDatas(10);
  55. String s = ObjToCSV.create(userDatas,"|")
  56. .fieldsAll()//显示全部字段
  57. .addExcludeFields("roleData")//排除指定字段
  58. .addHead()
  59. .addContents()
  60. .addEnding((data)->{
  61. JSONObject jsonObject = new JSONObject();
  62. jsonObject.put("count",data.getNumber());
  63. jsonObject.put("time",data.getCreateDate());
  64. jsonObject.put("separator",data.getSeparator());
  65. return jsonObject.toJSONString();
  66. })
  67. .ToString();
  68. System.out.println(s);
  69. }
  70. //只包含指定字段 ,其他都不显示
  71. @Test
  72. public void show4(){
  73. List<UserData> userDatas = RandomUserData.getUserDatas(10);
  74. String s = ObjToCSV.create(userDatas,"|")
  75. .addIncludeFields("id","name")
  76. .addHead() //添加头部
  77. .addContents() //添加内容
  78. .addEnding((data)->{ //添加结尾信息
  79. JSONObject jsonObject = new JSONObject();
  80. jsonObject.put("count",data.getNumber());
  81. jsonObject.put("time",data.getCreateDate());
  82. jsonObject.put("separator",data.getSeparator());
  83. return jsonObject.toJSONString();
  84. })
  85. .ToString();
  86. System.out.println(s);
  87. }
  88. //内容
  89. @Test
  90. public void show5(){
  91. List<UserData> userDatas = RandomUserData.getUserDatas(10);
  92. String s = ObjToCSV.create(userDatas,"|")
  93. .fieldsAll()
  94. .addExcludeFields("roleData")//排除指定字段
  95. .addContents() //添加内容
  96. .ToString();
  97. System.out.println(s);
  98. }
  99. @SneakyThrows
  100. public static void main(String[] args) {
  101. List<UserData> userDatas = RandomUserData.getUserDatas(100);
  102. String s = ObjToCSV.create(userDatas)
  103. .fieldsAll()
  104. // .addIncludeFields()
  105. .addExcludeFields("roleData")
  106. // .addHead()
  107. // .addContent()
  108. .addContents()
  109. .addEnding((data)->{
  110. JSONObject jsonObject = new JSONObject();
  111. jsonObject.put("count",data.getNumber());
  112. jsonObject.put("time",data.getCreateDate());
  113. return jsonObject.toJSONString();
  114. })
  115. .ToString();
  116. System.out.println(s);
  117. }
  118. }

点赞 -收藏-关注-便于以后复习和收到最新内容有其他问题在评论区讨论-或者私信我-收到会在第一时间回复如有侵权,请私信联系我感谢,配合,希望我的努力对你有帮助^_^

相关文章

最新文章

更多