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> ...
随机推荐
- NOIP集训 P4137 Rmq Problem / mex 题解
前置指使:可持久化线段树 题解:P4137 Rmq Problem / mex 有一个长度为 \(n\) 的数组 \(\{ a_1,a_2,...,a_n \}\) . \(m\) 次询问,每次询问一 ...
- Flex布局-margin 妙用技巧
在 flex 布局 中, 通过对子项设置 margin-auto; 的方式去吃掉剩余空间, 这种小技巧在很多时候能极大简化我们的布局哦. 单元素水平垂直居中 如果父容器是 flex, 要实现元素水平垂 ...
- React最新面试攻略
@charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...
- layui的验证码倒计时按钮
HTML部分 <div class="layui-form-item"> <label class="layui-icon layui-icon-ver ...
- c++单例模式总结
分类 懒汉式:实例对象在第一次被使用时才进行初始化. 饿汉式:实例在定义时就被初始化. 特点 1.构造函数和析构函数私有化,不允许外部创建实例对象. 2.拷贝构造函数和复制运算符重载被delete,不 ...
- CUDA 线程ID 计算方式
thread ID 的计算方式,简单来说很像小学学的除法公式,本文转载自同学一篇博客:并进行简单修改: 被除数 = 除数 * 商 + 余数 用公式表示:$$线程Id = blockId * block ...
- Beautiful code and beautiful life
You may ask me why do i strive constantly, what i am striving for? Yep, the same question haunts me ...
- JS/Jquery检查网络路径文件是否存在
var url='网络文件路径'; var isExists; $.ajax(url, { type: 'HEAD', dataType: 'text', async: false, success: ...
- LocalDateTime获取 年月日时分秒和判断日期大小
环境:java version "13.0.1". 创建一个DateUtils类,提供三个常用方法: String 转换 LocalDateTime的方法. 获取LocalDate ...
- redis客户端选型-Jedis、lettuce、Redisson
做个笔记,老是记不住 https://www.jianshu.com/p/ee30c184c854