csv文件导出注意事项
一、中文乱码问题
默认情况下,在windows上用excel打开csv文件时,并不是按utf-8码解析的,就算代码里设置了写入字符串为utf-8字符集,也可能乱码。
需要在文件头写入几个特殊的字节,做为utf-8的BOM头。
/**
* utf-8的bom头
*/
byte[] UTF8_HEADER_BOM = new byte[]{(byte) 0xEF, (byte) 0xBB, (byte) 0xBF};
建议导出后,用一些编辑工具查看16进制格式,确认前3个字节是否ef bb bf
二、大数字被显示为科学计数法的问题
一些产品编码,比如100000000001,打开后,会变成:
可在文本后加\t解决
三、海量数据写入时如何避免OOM
通常我们会把内容先拼成一个String,然后一次性写入,如果数据量巨大,比如上千万,一次性拼接很容易造成OOM。可以借用内存映射(NIO中的技术)优化。
RandomAccessFile file = new RandomAccessFile(csvFileName, "rw");
FileChannel channel = file.getChannel();
MappedByteBuffer mappedByteBuffer = channel.map(FileChannel.MapMode.READ_WRITE, file.length(), UTF8_HEADER_BOM.length);
mappedByteBuffer.put(UTF8_HEADER_BOM);
完整示例:
/**
* csv写入示例(菩提树下的杨过 http://yjmyzz.cnblogs.com)
*
* @throws IOException
*/
private static void testCsv() throws IOException {
/**
* utf-8的bom头
*/
byte[] UTF8_HEADER_BOM = new byte[]{(byte) 0xEF, (byte) 0xBB, (byte) 0xBF}; String csvFileName = "D:\\temp\\test.csv";
FileUtils.deleteQuietly(new File(csvFileName)); RandomAccessFile file = new RandomAccessFile(csvFileName, "rw");
FileChannel channel = file.getChannel(); byte[] header = "编号,品名,时间戳\n".getBytes("UTF-8"); //写入utf8的bom头,防止打开csv时显示乱码
MappedByteBuffer mappedByteBuffer = channel.map(FileChannel.MapMode.READ_WRITE, file.length(), UTF8_HEADER_BOM.length);
mappedByteBuffer.put(UTF8_HEADER_BOM); //写入标题栏
mappedByteBuffer = channel.map(FileChannel.MapMode.READ_WRITE, file.length(), header.length);
mappedByteBuffer.put(header); //分批写入记录(每批1000条)-防止OOM
long timestamp = System.currentTimeMillis();
for (int i = 1; i <= 100; i++) {
StringBuilder sb = new StringBuilder();
for (int j = 1; j <= 1000; j++) {
sb.append(i * j + "\t,");
sb.append("产品" + j + ",");
sb.append(timestamp + "\t\n");
}
byte[] data = sb.toString().getBytes("UTF-8");
mappedByteBuffer = channel.map(FileChannel.MapMode.READ_WRITE, file.length(), data.length);
mappedByteBuffer.put(data);
} //关闭通道
channel.close();
}
导出效果:
csv文件导出注意事项的更多相关文章
- python使用pymongo访问MongoDB的基本操作,以及CSV文件导出
1. 环境. Python:3.6.1 Python IDE:pycharm 系统:win7 2. 简单示例 import pymongo # mongodb服务的地址和端口号mongo_url = ...
- php 用csv文件导出大量数据初方案
背景:接手的项目中支持导出一批数据,全数量在50W左右.在接手的时候看代码是直接一次查询MySQL获得数据,然后用header函数直接写入csv,用户开始导出则自动下载.但是,在全导出的时候,功能出现 ...
- CSV文件导出2
public void exportCSVFile( HttpServletResponse response, ResultSet rs,String fileName,String headers ...
- csv文件导出
参考博客:http://www.cnblogs.com/mingforyou/p/4103132.html 导入jar包javacsv.jar 链接:http://pan.baidu.com/s/1i ...
- ifix历史数据(H04/H08/H24)转换为CSV文件导出
在最近的一次环保数据维护中,由于自己疏忽导致数据库中TP值并未有效记录,还好历史趋势有相关记录,问题是我该如何将.H24文件记录导出?在逛论坛后,无意发现一款工具解决了我的燃眉之急-HTD2CSV.e ...
- [转载] php用csv文件导出大量数据
header ( "Content-type:application/vnd.ms-excel" ); header ( "Content-Disposition:fil ...
- 每日学习心得:Linq解决DataTable按照某一列的值排序问题/DataTable 导出CSV文件/巧用text-overflow解决数据绑定列数据展示过长问题
2013-8-5 1 Linq解决DataTable按照某一列的值排序 在之前的总结中提到过对拼接而成的复合的DataTable按照某一列值的大小排序,那个主要的思想是在新建表结构时将要排序的那一列的 ...
- thinkphp导出csv文件,用表格输出excel
1.thinkphp导出csv文件 导出csv文件可能就那几行代码,今天有个问题困扰我好久,就是导出之后出现一些html代码,这个不应该,view里面是空的,controller中最后也没有$this ...
- es实战之数据导出成csv文件
从es将数据导出分两步: 查询大量数据 将数据生成文件并下载 本篇主要是将第二步,第一步在<es实战之查询大量数据>中已讲述. csv vs excel excel2003不能超过6553 ...
- Java 导出Excel xlsx、xls, CSV文件
通用导出功能: 1.支持Excel xlsx.xls 2.支持CSV文件导出 3.数据库查询分页导出.内存导出 4.支持大批量数据导出 使用步骤如下 导入jar <dependency> ...
随机推荐
- Java单例模式:从实战到面试的深度解析
结论先行 饿汉式:线程安全但可能造成资源浪费,推荐在初始化成本低的场景使用 懒汉式:需要解决线程安全问题,推荐使用双重检查锁+volatile优化 静态内部类:最佳实践方案,完美平衡延迟加载与线程安全 ...
- 如何构造一款类似One API的大模型集成平台
作为AI领域的开发者,我们经常需要调用多个不同的大语言模型,但面对各家不同的API规范和接入方式,集成工作变得繁琐.构建一个统一的大模型集成平台,能够极大地简化这一过程. 本文将探讨如何实现一个兼容O ...
- 分享5款开源、美观的 WinForm UI 控件库
前言 今天大姚给大家分享5款开源.美观的 WinForm UI 控件库,助力让我们的 WinForm 应用更好看. WinForm WinForm是一个传统的桌面应用程序框架,它基于 Windows ...
- Linux 的那些操作都出自哪里?
Linux 的那些操作都出自哪里? 可以说 Linux 是一种 Unix.Unix 有一个 man 手册,手册包含了安装的软件的使用帮助,遇到问题的解决办法.总之几乎所有的操作都是手册里面有迹可循的, ...
- CentOS 7.6 安装JDK 1.8
第一步,下载一个rpm包,下载链接如下 https://www.oracle.com/cn/java/technologies/downloads/ 第二步:上传到服务器中 第三步:输入命令进行安装 ...
- AI对低代码技术的影响
一.开发效率革命的"双引擎" 在过去的数十年里,软件工程领域正在经历一场由低代码平台和人工智能技术共同驱动的效率革命.这两股技术浪潮虽源于不同的技术路径,却共同指向同一个战略目标: ...
- mysql 添加外键约束
添加外键 alter table table_name add foreign key fk_product_id (product_id) references product(id) tabl ...
- select * 和 select 字段的区别
摘要:介绍 select * 和 select 字段的区别,建议各位不要使用 select * . 在千万级表中查询数据的时候,需要千方百计提升查询效率,为用户带来最爽的体验:业界各位大佬都提到 ...
- C++程序员必会的12个大项目,学会这些项目,找工作还是问题吗?
项目0-项目准备 项目1-黑客攻击系统 项目2-人工智能之地形导航系统 项目3-人工智能之双色球预测系统 项目4-地震监测系统 项目5-智能婚恋交友系统 项目6-广州军区微波通信系统 项目7-模板库高 ...
- jemelloc论文(中英翻译)
AScalable Concurrent malloc(3) Implementation for FreeBSD (基于FreeBSD的可伸缩的并发malloc(3)实现) 作者:Jason Eva ...