- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
csv全称“Comma-Separated Values”,是一种逗号分隔值格式的文件,是一种用来存储数据的纯文本格式文件。CSV文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其它字符或字符串。
Java对象转CSV,有现成的工具包,commons-lang3
的ReflectionToStringBuilder
就可以简单的解决的对象转CSV
但是复杂点的处理还是不行,而且在运行速度上,我测试了下我自己写的,比这个快多了,1百万条数据大约也就2秒左右, 如果对速度有要求的话,我们可以使用多线程进行分割,比如1千万条数据,那么我开10个线程,1个线程执行100万条数据,所有线程执行完毕后在按照顺序拼接到一起,这样1千万条数据也就最多3~5秒执行完毕
package com.file.csv;
import com.date.LocalDateUtils;
import lombok.Data;
import lombok.SneakyThrows;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Function;
/**
* 对象转csv格式
*
* @describe
* 1百万数据测试 2~3秒
* 调用顺序如下(根据情况自行选择)
* String s = ObjToCSV.create(userDatas)
* .fieldsAll() //转换全部列
* .addIncludeFields() //只包含某些列
* .addExcludeFields("roleData") //排除某些列
* .addHead() //添加头部字段
* .addContent() //一个对象(一行)
* .addContents() //多个对象(多行)
* .addEnding((data)->{ //结尾说明
* JSONObject jsonObject = new JSONObject();
* jsonObject.put("count",data.getNumber());
* jsonObject.put("time",data.getCreateDate());
* return jsonObject.toJSONString();
* })
* .ToString(); //结果
*/
@Data
public class ObjToCSV<T> {
private String separator = "\u0001|\u0001"; //默认分隔符
private StringBuilder str = new StringBuilder();
private T object;
private List<T> objects;
private List<String> excludeFields = new ArrayList<String>(100) {{
add("serialVersionUID");
}};
private List<String> includeFields = new ArrayList<String>(100);
private boolean fieldsAll = false;
private int number;//多少行一共
//日期串 20220617204504
private String createDate=LocalDateUtils.getLocalDateTimeStr1() ;
private ObjToCSV(T object, String separator) {
this.object = object;
this.separator = separator;
//行数
this.number=1;
}
private ObjToCSV(T object) {
this.object = object;
//行数
this.number=1;
}
private ObjToCSV(List<T> objects) {
if (objects.isEmpty()) {
throw new NullPointerException("不能是空");
}
this.object = objects.get(0);
this.objects = objects;
//行数
this.number=objects.size();
}
private ObjToCSV(List<T> objects, String separator) {
if (objects.isEmpty()) {
throw new NullPointerException("不能是空");
}
this.object = objects.get(0);
this.objects = objects;
this.separator = separator;
//行数
this.number=objects.size();
}
// 排除和包含都有,那么以包含的为主
private boolean decideFields(String fieldName) {
//包含
if (includeFields.contains(fieldName)) {
return false;
}
//排除
if (excludeFields.contains(fieldName)) {
return true;
}
// 开启全部放行
if (fieldsAll) {
return false;
}
//默认拦截全部
return true;
}
public static <T> ObjToCSV<T> create(T object, String separator) {
return new ObjToCSV<T>(object, separator);
}
public static <T> ObjToCSV<T> create(T object) {
return new ObjToCSV<T>(object);
}
public static <T> ObjToCSV<T> create(List<T> object, String separator) {
return new ObjToCSV<T>(object, separator);
}
public static <T> ObjToCSV<T> create(List<T> object) {
return new ObjToCSV<T>(object);
}
//全部放行
public ObjToCSV<T> fieldsAll() {
fieldsAll = true;
return this;
}
//包含
public ObjToCSV<T> addIncludeFields(String... fieldName) {
includeFields.addAll(Arrays.asList(fieldName));
return this;
}
//排除
public ObjToCSV<T> addExcludeFields(String... fieldName) {
excludeFields.addAll(Arrays.asList(fieldName));
return this;
}
//添加头部
public ObjToCSV<T> addHead() {
StringBuilder str1 = new StringBuilder();
Class<?> aClass = this.object.getClass();
Field[] fields = aClass.getDeclaredFields();
int length = fields.length;
for (int i = 0; i < length; i++) {
Field field = fields[i];
field.setAccessible(true);
if (decideFields(field.getName())) {
continue;
}
str1.append(field.getName()).append(separator);
}
int length1 = separator.length();
String substring = str1.substring(0, str1.length() - length1);
this.str.append(substring + "\n");
return this;
}
//在结尾补充自定义的描述
public ObjToCSV<T> addEnding(Function<ObjToCSV,String> functor){
String apply = functor.apply( this);
this.str.append(apply);
return this;
}
//将对象转换为CSV格式字符串
@SneakyThrows
public ObjToCSV<T> addContent() {
StringBuilder str1 = new StringBuilder();
Class<?> aClass = this.object.getClass();
Field[] fields = aClass.getDeclaredFields();
int length = fields.length;
for (int i = 0; i < length; i++) {
Field field = fields[i];
field.setAccessible(true);
if (decideFields(field.getName())) {
continue;
}
Object o = field.get(object);
String value = "";
if (o != null) {
value = String.valueOf(o);
}
str1.append(value).append(separator);
}
int length1 = separator.length();
String substring = str1.substring(0, str1.length() - length1);
this.str.append(substring + "\n");
return this;
}
//将多个对象转换为csv格式
public ObjToCSV<T> addContents() {
for (T t : this.objects) {
this.object=t;
addContent();
}
return this;
}
//将结果输出为字符串
public String ToString() {
return str.toString();
}
}
package com.file;
import com.alibaba.fastjson.JSONObject;
import com.data.RandomUserData;
import com.entity.UserData;
import com.file.csv.ObjToCSV;
import com.file.csv.ObjToCSV;
import com.function.impl.CodeStartAndStopTimeUtil;
import lombok.SneakyThrows;
import org.junit.Test;
import java.util.List;
public class ObjToCSVTest {
//单个对象
@Test
public void show1(){
UserData userOne = RandomUserData.getUserOne();
String s = ObjToCSV.create(userOne)
.fieldsAll()
// .addIncludeFields()
.addExcludeFields("roleData")
// .addHead()
.addContent()
// .addContents()
.addEnding((data)->{
JSONObject jsonObject = new JSONObject();
jsonObject.put("count",data.getNumber());
jsonObject.put("time",data.getCreateDate());
jsonObject.put("separator",data.getSeparator());
return jsonObject.toJSONString();
})
.ToString();
System.out.println(s);
}
//多个对象,可以使用自定义分隔符
@Test
public void show2(){
UserData userOne = RandomUserData.getUserOne();
String s = ObjToCSV.create(userOne,"|")
.fieldsAll()
.addExcludeFields("roleData")
.addContent()
.addEnding((data)->{
JSONObject jsonObject = new JSONObject();
jsonObject.put("count",data.getNumber());
jsonObject.put("time",data.getCreateDate());
jsonObject.put("separator",data.getSeparator());
return jsonObject.toJSONString();
})
.ToString();
System.out.println(s);
}
//排除不显示的,其他都显示
@Test
public void show3(){
List<UserData> userDatas = RandomUserData.getUserDatas(10);
String s = ObjToCSV.create(userDatas,"|")
.fieldsAll()//显示全部字段
.addExcludeFields("roleData")//排除指定字段
.addHead()
.addContents()
.addEnding((data)->{
JSONObject jsonObject = new JSONObject();
jsonObject.put("count",data.getNumber());
jsonObject.put("time",data.getCreateDate());
jsonObject.put("separator",data.getSeparator());
return jsonObject.toJSONString();
})
.ToString();
System.out.println(s);
}
//只包含指定字段 ,其他都不显示
@Test
public void show4(){
List<UserData> userDatas = RandomUserData.getUserDatas(10);
String s = ObjToCSV.create(userDatas,"|")
.addIncludeFields("id","name")
.addHead() //添加头部
.addContents() //添加内容
.addEnding((data)->{ //添加结尾信息
JSONObject jsonObject = new JSONObject();
jsonObject.put("count",data.getNumber());
jsonObject.put("time",data.getCreateDate());
jsonObject.put("separator",data.getSeparator());
return jsonObject.toJSONString();
})
.ToString();
System.out.println(s);
}
//内容
@Test
public void show5(){
List<UserData> userDatas = RandomUserData.getUserDatas(10);
String s = ObjToCSV.create(userDatas,"|")
.fieldsAll()
.addExcludeFields("roleData")//排除指定字段
.addContents() //添加内容
.ToString();
System.out.println(s);
}
@SneakyThrows
public static void main(String[] args) {
List<UserData> userDatas = RandomUserData.getUserDatas(100);
String s = ObjToCSV.create(userDatas)
.fieldsAll()
// .addIncludeFields()
.addExcludeFields("roleData")
// .addHead()
// .addContent()
.addContents()
.addEnding((data)->{
JSONObject jsonObject = new JSONObject();
jsonObject.put("count",data.getNumber());
jsonObject.put("time",data.getCreateDate());
return jsonObject.toJSONString();
})
.ToString();
System.out.println(s);
}
}
点赞 -收藏-关注-便于以后复习和收到最新内容有其他问题在评论区讨论-或者私信我-收到会在第一时间回复如有侵权,请私信联系我感谢,配合,希望我的努力对你有帮助^_^
我已经在标准 WPF 控件中实现了一个报告,并且还实现了一个 DocumentPaginator获取这些控件并将它们转换为用于打印的文档。 我还实现了一些使用文档分页器将页面呈现为图像并使用 PDFS
在 C# 中,我有以下代码: public static string GetHashCode(string p) { var a = new SHA256Managed();
您好,我正在尝试在编码后将我的 mysqli 数据库输出到一个 js 文件,我用 json_encode 对其进行编码没有任何问题,但是如何将其放入 js 文件中(每次更新时更新) mysqli数据已
我需要将 select 从 JS 传递到 HTML。 select 应该包含来自 PHP 的 option。 所以,首先我有一个 HTML div,我将在其中添加来自 JS 的内容。
我有一个相当大且复杂的 SVG 代码,它根据页面信息使用 JavaScript 和 jQuery 动态生成。 然后我有一个 AJAX 帖子保存。 我无法将其转换为正确发布图像数据? var canva
我想将我的本地日期 ([NSDate date]) 转换为 GMT 以创建一个 JSON 字符串 (/Date(1324435876019-0000)/)。 当我将时钟设置为 EST 时区时,我的代码
1. 原始单据与实体之间的关系 可以是一对1、一对多、多对多的关系。在一般情况下,它们是一对一的关系:即一张原始单据对应且只对应一个实体。在特殊情况下,它们可能是一对多或多对一的关系,即一张原
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界. 这篇CFSDN的博客文章服务器五大相关基础知识【转】由作者收集整理,如果你对这篇文章有兴趣,记得
Google Apps 脚本 - Gmail 是否会实现 GmailMessage (GmailThread) .getAsPdf() 方法?预期输出与 Gmail 中可用的打印为 PDF 的输出相同
有一个需求是要在一个云监控的状态值中存储多个状态(包括可同时存在的各种异常、警告状态)使用了位运算机制在一个int型中存储。 现在监控日志数据量非常大(亿级别)需要对数据按每小时、每天进行聚合,供
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界. 这篇CFSDN的博客文章1张图看懂RAID功能,6张图教会配置服务器【转】由作者收集整理,如果你
我正在使用 FFMPeg(版本 ffmpeg-20170330-ad7aff0-win64-static)将 RTSP 转换为 .m3u8。 命令是: ffmpeg -rtsp_transport t
我有一个 JTree使用 DefaultTreeModel 的对象作为模型,我添加/删除与该模型相关的节点。 此时,我需要在图形界面中显示树结构,例如 JPanel .如何映射 DefaultTree
我当前正在接收一个文件并将其存储到 NSString 中。然后,我从字符串中创建一个数组并将其呈现在 TableView 中。这在一定程度上有效。我目前收到的数据如下: 公司名称|帐户代码\r\n公司
我需要创建 NSImage cocoa 对象的 base64 字符串表示形式。处理这个问题的最佳方法是什么,苹果文档似乎在这个主题上有点短(或者我只是找不到它)。 Base64 编码从外面看起来相当复
JS 中的 .toISOString() 函数给我这样的字符串: 2015-06-14T20:00:00:000Z 我需要它是这样的: 2015-06-14T20:00:00Z JS 中是否有其他函数
我正在尝试使用 JavaScript 转换 COLORREF: COLORREF : When specifying an explicit RGB color, the COLORREF value
我在这里遇到了这个代码的问题,只是想制作一个小计算器: 打包申请; import javafx.event.ActionEvent; import javafx.scene.control.TextF
我想要做的是能够通过本地PC上的USS通过sshfs挂载主机上的一些文件。我可以做到这一点,但 sshfs 不能直接完成从 EBCDIC 到 ascii/unicode 的转换。有没有我可以设置的标志
我正在尝试在 python 中将一堆 Visio 文件转换为 pdf。我已经引用了这个.doc to pdf using python并编写了以下代码: import comtypes.client
我是一名优秀的程序员,十分优秀!