Java 将对象List转为csv文件并上传远程文件服务器实现方案
问题情景:
最近项目中遇到了根据第三方系统传递过来的参数,封装为List<实体类对象>后,将该实体类转换为csv文件,然后上传到远程的sftp服务器指定目录的需求。
实现思路:
- List<实体类对象>转为csv文件的过程。通过OpenCsv实现。
阻塞点:
1.最开始遇到了生成的csv文件的第一行生成的字段名,变成了实体类的大写字段名了,例如userName变为USERNAME并且排序混乱。
2.通过查阅资料找到了以下两个注解,后期却发现两个注解不能同时出现。详见文章
为什么 opencsv 在写入文件时将 csv 标头大写
@CsvBindByName(column = "TradeID")
@CsvBindByPosition(position = 0)
解决方案:
方案一:
创建自定义MappingStrategy :
class CustomMappingStrategy extends ColumnPositionMappingStrategy {
private static final String[] HEADER = new String[]{“TradeID”, “GWML GUID”, “MXML GUID”, “GWML File”, “MxML File”, “MxML Counterparty”, “GWML Counterparty”};
@Override
public String[] generateHeader() {return HEADER;
}
}
并在StatefulBeanToCsvBuilder使用它:
final CustomMappingStrategy mappingStrategy = new CustomMappingStrategy<>();
mappingStrategy.setType(MappingsBean.class);
final StatefulBeanToCsv beanToCsv = new StatefulBeanToCsvBuilder(writer)
.withMappingStrategy(mappingStrategy)
.build();
beanToCsv.write(makeFinalMappingBeanList());
writer.close()
在MappingsBean类中,我们留下了CsvBindByPosition注释 - 以控制排序(在此解决方案中, CsvBindByName注释)。 由于自定义映射策略,标题列名称包含在生成的 CSV 文件中。
此解决方案的缺点是,当我们通过CsvBindByPosition注释更改列顺序时,我们必须手动更改自定义映射策略中的HEADER常量。
方案二:
该方案可以根据实体类字段名称生成CSV第一行,注意一定不要加@CsvBindByName注解,具体文章可以参考opencsv 将对象数组导出为 csv 文件时、文件列按对象字段定义顺序排序的实现
@SneakyThrows
public <T> String generateCsvFile(List<? extends T> exportResults, String fileName)throws IOException, CsvDataTypeMismatchException, CsvRequiredFieldEmptyException {String finalFileName = new File(nginxDownloadPath,fileName + System.currentTimeMillis() + ".csv").getPath();Writer writer = new FileWriter(finalFileName);CSVWriter csvWriter = new CSVWriter(writer,CSVWriter.DEFAULT_SEPARATOR,CSVWriter.DEFAULT_QUOTE_CHARACTER,CSVWriter.NO_ESCAPE_CHARACTER,CSVWriter.DEFAULT_LINE_END);csvWriter.writeNext(header);if (exportResults.size() > 0) {//写内容StatefulBeanToCsv beanToCsv = new StatefulBeanToCsvBuilder<T>(writer).withMappingStrategy(new OrderColumnMappingStrategy(exportResults.get(0).getClass())).withIgnoreField(exportResults.get(0).getClass(), Arrays.stream(exportResults.get(0).getClass().getDeclaredFields()).filter(one -> {one.setAccessible(true);return one.isAnnotationPresent(CsvIgnore.class);}).findFirst().orElse(null)).build();beanToCsv.write(exportResults);}csvWriter.close();writer.close();return finalFileName;
}public class OrderColumnMappingStrategy<T> extends HeaderColumnNameMappingStrategy<T> {private Locale errorLocale = Locale.getDefault();public OrderColumnMappingStrategy(Class<? extends T> type) {super();this.setErrorLocale(errorLocale);this.setType(type);}@Overridepublic String[] generateHeader(T bean) throws CsvRequiredFieldEmptyException {if (type == null) {throw new IllegalStateException(ResourceBundle.getBundle(ICSVParser.DEFAULT_BUNDLE_NAME, errorLocale).getString("type.before.header"));}if (headerIndex.isEmpty()) {List<String> realHeaderList = new ArrayList<>();/**getFieldNameForCsvHeader()方法是通过反射获取对象的字段, 字段是按照定义顺序返回的. 这里就不贴出代码了*/getFieldNameForCsvHeader(type).forEach(one -> {realHeaderList.add(one.toUpperCase());});String[] header = realHeaderList.toArray(new String[0]);headerIndex.initializeHeaderIndex(header);return header;}return headerIndex.getHeaderIndex();}
}
相关文章:
Java 将对象List转为csv文件并上传远程文件服务器实现方案
问题情景: 最近项目中遇到了根据第三方系统传递过来的参数,封装为List<实体类对象>后,将该实体类转换为csv文件,然后上传到远程的sftp服务器指定目录的需求。 实现思路: List<实体类对象>转为csv文件的…...
分享8个分布式Kafka的使用场景
Kafka 最初是为海量日志处理而构建的。它保留消息直到过期,并让消费者按照自己的节奏提取消息。与它的前辈不同,Kafka 不仅仅是一个消息队列,它还是一个适用于各种情况的开源事件流平台。 1. 日志处理与分析 下图显示了典型的 ELK࿰…...
【再见了暗恋对象 朋友们看完之后的一些感悟】
【再见了暗恋对象】写完之后魏野是我的第一个读者,魏野的反应是:这就是青春啊,喜欢了一个不喜欢自己的人而且男生觉得很困扰女孩子喜欢被牵引着走,但是男孩子牵引就是因为不喜欢这个女孩子,好可怜!青春就这…...
JSON和Protobuf序列化
文章目录 一、粘包和拆包1、半包问题2、半包现象原理 二、JSON协议通信1、通用类库2、JSON传输的编码器和解码器 三、Protobuf协议通信1、一个简单的proto文件的实践案例2、生成POJO和Builder3、消息POJO和Builder的使用案例1)构造POJO消息对象2)序列化和…...
lambda表达式 - c++11
文章目录: lambda表达式概念lambda表达式语法函数对象与lambda表达式 lambda表达式概念 lambda 表达式是 c11 中引入的一种匿名函数,它可以在需要函数对象的地方使用,可以用作函数参数或返回值。lambda 表达式可以看作是一种局部定义的函数对…...
509. 斐波那契数
斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) 0,F(1) 1 F(n) F(n - 1) F(n - 2),其中 n > 1给定 n &a…...
四、[mysql]索引优化-1
目录 前言一、场景举例1.联合索引第一个字段用范围查询不走索引(分情况)2.强制走指定索引3.覆盖索引优化4.in和or在表数据量比较大的情况会走索引,在表记录不多的情况下会选择全表扫描5.like 后% 一般情况都会走索引(索引下推) 二、Mysql如何选择合适的索…...
PyTorch入门学习(九):神经网络-最大池化使用
目录 一、数据准备 二、创建神经网络模型 三、可视化最大池化效果 一、数据准备 首先,需要准备一个数据集来演示最大池化层的应用。在本例中,使用了CIFAR-10数据集,这是一个包含10个不同类别图像的数据集,用于分类任务。我们使…...
0基础学习PyFlink——用户自定义函数之UDF
大纲 标量函数入参并非表中一行(Row)入参是表中一行(Row)alias PyFlink中关于用户定义方法有: UDF:用户自定义函数。UDTF:用户自定义表值函数。UDAF:用户自定义聚合函数。UDTAF&…...
英语小作文模板(06求助+描述;07描述+建议)
06 求助描述: 题目背景及要求 第一段 第二段 第三段 翻译成中文 07 描述+建议: 题目背景及要求 第一段 第二段...
为什么感觉假期有时候比上班还累?
假期比上班还累的感觉可能由以下几个原因造成: 计划过度:在假期里,人们往往会制定各种计划,如旅游、聚会、休息等,以充分利用这段时间。然而,如果这些计划过于紧张或安排得过于紧密,就会导致身…...
推理还是背诵?通过反事实任务探索语言模型的能力和局限性
推理还是背诵?通过反事实任务探索语言模型的能力和局限性 摘要1 引言2 反事实任务2.1 反事实理解检测 3 任务3.1 算术3.2 编程3.3 基本的句法推理3.4 带有一阶逻辑的自然语言推理3.5 空间推理3.6 绘图3.7 音乐3.8 国际象棋 4 结果5 分析5.1 反事实条件的“普遍性”5…...
《利息理论》指导 TCP 拥塞控制
欧文费雪《利息原理》第 10 章,第 11 章对利息的几何说明是普适的,任何一个负反馈系统都能引申出新结论。给出原书图示,本文依据于此,详情参考原书: 将 burst 看作借贷是合理的,它包含成本(报文)…...
Bsdiff,Bspatch 的差分增量升级(基于Win和Linux)
目录 背景 内容 准备工作 在windows平台上 在linux平台上 正式工作 生成差分文件思路 作用差分文件思路 在保持相同目录结构进行差分增量升级 服务端(生成差分文件) 客户端(作用差分文件) 背景 像常见的Android 的linux平台,游戏,系统更新都…...
【3妹教我学历史-秦朝史】2 秦穆公-韩原之战
插: 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 坚持不懈,越努力越幸运,大家一起学习鸭~~~ 3妹:2哥,今天下班这么早&#…...
车载控制器
文章目录 车载控制器电动汽车上都有什么ECU 车载控制器 智能汽车上的控制器数量因车型和制造商而异。一般来说,现代汽车可能有50到100个电子控制单元(ECU)或控制器。这些控制器负责管理各种系统,如发动机管理、刹车、转向、空调、…...
回归预测 | Matlab实现RIME-CNN-SVM霜冰优化算法优化卷积神经网络-支持向量机的多变量回归预测
回归预测 | Matlab实现RIME-CNN-SVM霜冰优化算法优化卷积神经网络-支持向量机的多变量回归预测 目录 回归预测 | Matlab实现RIME-CNN-SVM霜冰优化算法优化卷积神经网络-支持向量机的多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.RIME-CNN-SVM霜冰优化算…...
使用Jaeger进行分布式跟踪:学习如何在服务网格中使用Jaeger来监控和分析请求的跟踪信息
🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…...
添加多个单元对象
开发环境: Windows 11 家庭中文版Microsoft Visual Studio Community 2019VTK-9.3.0.rc0vtk-example参考代码 demo解决问题:不同阶段添加多个单元对象。 定义一个点集和一个单元集合,单元的类型可以是点、三角形、矩形、多边形等基本图形。只…...
十八、模型构建器(ModelBuilder)快速提取城市建成区——批量掩膜提取夜光数据、夜光数据转面、面数据融合、要素转Excel(基于参考比较法)
一、前言 前文实现批量投影栅格、转为整型,接下来重点实现批量提取夜光数据,夜光数据转面、夜光数据面数据融合、要素转Excel。将相关结果转为Excel,接下来就是在Excel中进行阈值的确定,阈值确定无法通过批量操作,除非采用其他方式,但是那样的学习成本较高,对于参考比较…...
从零到一:STM32F407 HAL库定时器中断精准点亮LED(CubeMX实战)
1. 开发环境搭建与硬件准备 第一次接触STM32开发的朋友可能会被各种专业术语吓到,但其实只要跟着步骤来,配置开发环境就像搭积木一样简单。我手头用的是正点原子探索者V3开发板,主控芯片是STM32F407ZGT6,这块板子对新手特别友好&a…...
深入解析EasyExcel自定义列样式:基于AbstractVerticalCellStyleStrategy的灵活实现
1. 为什么需要自定义列样式? 在实际开发中,我们经常遇到这样的需求:导出的Excel表格需要根据不同列的内容类型设置不同的样式。比如文字列需要居中显示,数字列需要右对齐,金额列可能需要特殊格式和颜色标注。这种需求在…...
ShaderGlass在OBS直播中的高级用法:打造视觉震撼的实时画面效果
ShaderGlass在OBS直播中的高级用法:打造视觉震撼的实时画面效果 【免费下载链接】ShaderGlass Overlay for running GPU shaders on top of Windows desktop 项目地址: https://gitcode.com/gh_mirrors/sh/ShaderGlass ShaderGlass是一款能在Windows桌面上运…...
Dgraph索引选择终极指南:查询模式与索引类型完美匹配
Dgraph索引选择终极指南:查询模式与索引类型完美匹配 【免费下载链接】dgraph The high-performance database for modern applications 项目地址: https://gitcode.com/gh_mirrors/dg/dgraph Dgraph作为现代应用的高性能图数据库,其索引系统是查…...
终极指南:如何用qmc-decoder轻松解锁QQ音乐加密文件
终极指南:如何用qmc-decoder轻松解锁QQ音乐加密文件 【免费下载链接】qmc-decoder Fastest & best convert qmc 2 mp3 | flac tools 项目地址: https://gitcode.com/gh_mirrors/qm/qmc-decoder 你是否曾经从QQ音乐下载了喜爱的歌曲,却发现只能…...
OptiScaler终极配置指南:解锁游戏画质提升的7个关键技术
OptiScaler终极配置指南:解锁游戏画质提升的7个关键技术 【免费下载链接】OptiScaler DLSS replacement for AMD/Intel/Nvidia cards with multiple upscalers (XeSS/FSR2/DLSS) 项目地址: https://gitcode.com/GitHub_Trending/op/OptiScaler OptiScaler是一…...
创龙T113-i开发板:从SDK解压到镜像打包,一个完整Linux系统构建实录(含80分钟编译避坑)
创龙T113-i开发板实战:从零构建嵌入式Linux系统的完整指南 1. 开发环境准备与SDK解压 第一次接触全志T113-i开发板时,最令人头疼的莫过于搭建开发环境。与常见的树莓派或BeagleBone开发板不同,工业级嵌入式设备往往需要更专业的工具链支持。我…...
OpenClaw+GLM-4.7-Flash:3步实现自动化邮件处理
OpenClawGLM-4.7-Flash:3步实现自动化邮件处理 1. 为什么需要自动化邮件处理? 每天早晨打开邮箱,看到堆积如山的未读邮件时,那种窒息感我太熟悉了。作为技术团队的接口人,我的邮箱常年保持着200未读邮件的状态——有…...
春联生成模型-中文-base实战教程:对接企业微信机器人自动发春联
春联生成模型-中文-base实战教程:对接企业微信机器人自动发春联 春节将至,给同事、客户或社群成员发送一份AI生成的专属春联,是不是既新颖又有心意?手动一个个生成再发送,效率太低。今天,我们就来实战一个…...
个人作品集展示的最佳实践与工具选择
对于设计师、摄影师、插画师等创意人士而言,个人作品集是展示专业能力的重要窗口。 如何将作品以最佳方式呈现给潜在客户或雇主,是每个创意人士都需要认真思考的问题。 PDF格式因其跨平台兼容性和排版稳定性,成为作品集展示的首选格式。 它能…...
