别动我的奶酪:CSV文件数据丢零现象及对策
CSV文件在读入EXCEL时,对于前面有零的数据项,比如电话号码,会自作聪明地丢掉那个零。
比如,我有一个北京客户,其号码为01059178888,如果这是通过CSV文件来的数据,在EXCEL中打开时,就成了1059178888,甚至会成为1E+9。
当然,微软官方帮助文件说,你在打开此类文件时,手动指定列的类型就可以避免丢零。如果我有几个这样的列,倒还可以,如果有几十个这样的列呢?累死人啊。还有,有些用户就希望彻底自动化,对此,微软还真没有给出什么解决方案。全世界成千上万的用户在解决丢零问题上不知浪费了多少时间。
对微软来说,解决这个问题可以说是徒手之劳,比如,允许用户设置成,在读入CSV文件时,所有列都缺省为字符串,而不是让EXCEL自作聪明去解释数据。
请问,谁给了EXCEL改变我数据的权利?
当然,这种现象除了微软的傲慢外,CSV格式的先天不足是另外一个原因。CSV只包含数据,而对数据并无任何描述。这就使得微软对用户数据动手动脚提供了借口。
近年来,随着XML的进化与普及,随着微软软件的进一步公开化,这个问题的解决已显露端倪。
这里假设我要从数据库中读出一批数据,将其保存为文本文件,让用户在EXCEL上进一步处理。
我不希望丢零,又希望用户不费太多手脚。
(本文使用的验证环境为 EXCEL 2010)
数据样品如下:
ID | Name | Phone | Address |
0001 | 李开复 | 01059178888 | 北京市朝阳区望京街8号利星行广场微软大厦 12 层 |
0002 | 张复开 | 01059179999 | 北京市朝阳区望京街9号利星行广场巨硬大厦 21 层 |
1. 输出CSV格式,数据如下:
0001,李开复,01059178888,北京市朝阳区望京街8号利星行广场微软大厦 12 层
0002,张复开,01059179999,北京市朝阳区望京街9号利星行广场巨硬大厦 21 层
如果在EXCEL中打开以上CSV格式的文件,将会出现:
ID | Name | Phone | Address |
1 | 李开复 | 1E+9 | 北京市朝阳区望京街8号利星行广场微软大厦 12 层 |
2 | 张复开 | 1E+9 | 北京市朝阳区望京街9号利星行广场巨硬大厦 21 层 |
ID前的0丢掉了不说,电话号码变成了科学计数法的数字。
2. 输出简单XML格式
因为是简单的XML格式,并不牵扯定义DAD等文件,在程序上容易实现。
例如:
<?xml version='1.0'?>
<?xml-stylesheet type="text/xsl" href="simple.xsl" ?>
<customer>
<row>
<ID>0001</ID>
<Name>李开复</Name>
<Phone>01059178888</Phone>
<Address>北京市朝阳区望京街8号利星行广场微软大厦 12 层</Address>
</row>
<row>
<ID>0002</ID>
<Name>张复开</Name>
<Phone>01059179999</Phone>
<Address>北京市朝阳区望京街9号利星行广场巨硬大厦 21 层</Address>
</row>
</customer>
在EXCEL打开时,出现几个对话框,但只要按OK键,还是可以打开。但是,ID/Phone还是丢零。
ID | Name | Phone | Address |
1 |
李开复 | 1059178888 | 北京市朝阳区望京街8号利星行广场微软大厦 12 层 |
2 | 张复开 | 1059179999 | 北京市朝阳区望京街9号利星行广场巨硬大厦 21 层 |
别急,我们可以告诉EXCEL,这个ID列是文字。
下例中,通过给第一行数据置入文字串的做法,让EXCEL把所有的列都认作文字,而不是数字,从而避免丢零。
<?xml version='1.0'?>
<?xml-stylesheet type="text/xsl" href="simple.xsl" ?>
<DATA>
<row>
<A>ID</A>
<B>Name</B>
<C>Phone</C>
<D>Address</D>
</row>
<row>
<A>0001</A>
<B>李开复</B>
<C>01059178888</C>
<D>北京市朝阳区望京街8号利星行广场微软大厦 12 层</D>
</row>
<row>
<A>0002</A>
<B>张复开</B>
<C>01059179999</C>
<D>北京市朝阳区望京街9号利星行广场巨硬大厦 21 层</D>
</row>
</DATA>
在EXCLE打开时: (第一行的abcd是新加的项目名称,红色部分才是原来的名称。)
A | B | C | D |
ID | Name | Phone | Address |
0001 |
李开复 | 01059178888 | 北京市朝阳区望京街8号利星行广场微软大厦 12 层 |
0002 | 张复开 | 01059179999 | 北京市朝阳区望京街9号利星行广场巨硬大厦 21 层 |
这样的数据打开后,用户只要删除第一行也就可以了。
3. 输出XML Spreadsheet 2003(XMLSS)格式
XMLSS的格式就要复杂一些。但仍然是编程可以接受的范围。
但是,我们可以省略一些不必要的东西。下例就是一个不能再简化的XMLSS数据。
<?xml version="1.0"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:html="http://www.w3.org/TR/REC-html40"
xmlns:x2="http://schemas.microsoft.com/office/excel/2003/xml">
<Worksheet ss:Name="Sheet1">
<Table ss:ExpandedColumnCount="4" ss:ExpandedRowCount="3" x:FullColumns="1"
x:FullRows="1" ss:DefaultColumnWidth="54" ss:DefaultRowHeight="13.5">
<Column ss:Width="38.25"/>
<Column ss:Width="52.5"/>
<Column ss:Width="76.5"/>
<Column ss:Width="281.25"/>
<Row>
<Cell><Data ss:Type="String">ID</Data></Cell>
<Cell><Data ss:Type="String">Name</Data></Cell>
<Cell><Data ss:Type="String">Phone</Data></Cell>
<Cell><Data ss:Type="String">Address</Data></Cell>
</Row>
<Row>
<Cell><Data ss:Type="String">0001</Data></Cell>
<Cell><Data ss:Type="String">李开复</Data></Cell>
<Cell><Data ss:Type="String">01059178888</Data></Cell>
<Cell><Data ss:Type="String">北京市朝阳区望京街8号利星行广场微软大厦 12 层</Data></Cell>
</Row>
<Row>
<Cell><Data ss:Type="Number">0002</Data></Cell>
<Cell><Data ss:Type="String">张复开</Data></Cell>
<Cell><Data ss:Type="String">01059179999</Data></Cell>
<Cell><Data ss:Type="String">北京市朝阳区望京街9号利星行广场巨硬大厦 21 层</Data></Cell>
</Row>
</Table>
</Worksheet>
</Workbook>
因为可以具体指定每个Cell的数据类型(Number/String/Date),可以更精确地显示各个数据的格式。
上例中故意把【0002】这个数据指定为Number,在读入Excel之后,这项数据前面的零将被丢掉。
ID | Name | Phone | Address |
001 |
李开复 | 1059178888 | 北京市朝阳区望京街8号利星行广场微软大厦 12 层 |
张复开 | 1059179999 | 北京市朝阳区望京街9号利星行广场巨硬大厦 21 层 |
如何生成上述XMLSS格式的数据,这个太简单了,就不用我再说了吧。
4. 直接生成XLSX文件
从Office2007之后,Excel文件后缀变成4位,xlsx。xslx文件实际上是一个zip文件。如果你改变xlsx后缀为zip,你就可以打开它。
你会发现,这是一大堆xml文件和其他数据文件的组合。如果你下点功夫,你会弄懂它的结构。
最近发现一位大牛为APEX写的一个插件,从ORACLE中能直接输出xlsx文件。
http://www.apex-plugin.com/oracle-apex-plugins/process-type-plugin/ir-report-to-excel-xlsx_74.html
有兴趣的话可以看看。我试着用过,修改了对列数目的限制,还是不错的。当然,还有一些其他问题,以后做别论。
别动我的奶酪:CSV文件数据丢零现象及对策的更多相关文章
- java读取目录下所有csv文件数据,存入三维数组并返回
package dwzx.com.get; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; ...
- jmeter参数化、添加变量、生成随机数和导入csv文件数据
Remarks:本次使用jmeter版本为4.0 以下数据都在必应中演示: 添加普通变量 1.添加 User Defined Variables(用户自定义变量) 2.设置变量 3.使用变量 4.查看 ...
- java 两个csv文件数据去重
1.pom.xml配置 <dependency> <groupId>commons-io</groupId> <artifactId>commons-i ...
- HttpRunner学习7--引用CSV文件数据
前言 在之前的文章中,我们已经学习了 parameters 参数化,是在测试脚本中直接指定参数列表.这种方法简单易用,但如果我们的参数列表数据比较多,这种方法可能就不太适合了. 当数据量比较大的时候, ...
- C#使用Linq to csv读取.csv文件数据
前言:今日遇到了一个需要读取CSV文件类型的EXCEL文档数据的问题,原本使用NPOI的解决方案直接读取文档数据,最后失败了,主要是文件的类型版本等信息不兼容导致.其他同事有使用linq to csv ...
- CSV文件数据如何读取、导入、导出到新的CSV文件中以及CSV文件的创建
CSV文件数据如何读取.导入.导出到新的CSV文件中以及CSV文件的创建 一.csv文件的创建 (1)新建一个文本文档: 打开新建文本文档,进行编辑. 注意:关键字与关键字之间用英文半角逗号隔开.第一 ...
- C语言进行csv文件数据的读取
C语言进行csv文件数据的读取: #include <stdio.h> #include <string.h> #include <malloc.h> #inclu ...
- java调用sqlldr导入csv文件数据到临时表
package cn.com.file;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File; ...
- python读取两个csv文件数据,进行查找匹配出现次数
现有需求 表1 表2 需要拿表1中的编码去表2中的门票编码列匹配,统计出现的次数,由于表2编码列是区域间,而且列不是固定的,代码如下 #encoding:utf-8 ##导入两个CSV进行比对 imp ...
随机推荐
- POJ 2777 线段树基础题
题意: 给你一个长度为N的线段数,一开始每个树的颜色都是1,然后有2个操作. 第一个操作,将区间[a , b ]的颜色换成c. 第二个操作,输出区间[a , b ]不同颜色的总数. 直接线段树搞之.不 ...
- 架构漫谈:UML中几种类间关系:继承、实现、依赖、关联、聚合、组合的联系与区别
这是一堂关于UML基础知识的补习课:现在我们做项目时间都太紧了,基本上都没有做过真正的class级别的详细设计,更别提使用UML来实现规范建模了:本篇主要就以前自己一直感觉很迷糊的几种class之间的 ...
- android在view.requestFocus(0)返回false的解决办法
我们有时候想让listview的第一行自动获取到焦点,我们就会使用view.requestFocus(0)来操作,而有时候并不生效,debug后显示rerurn为false. 这是因为我们获取焦点太早 ...
- android之wifi开发
WIFI就是一种无线联网技术,常见的是使用无线路由器.那么在这个无线路由器的信号覆盖的范围内都可以采用WIFI连接的方式进行联网.如果无线路由器连接了一个ADSL线路或其他的联网线路,则又被称为“热点 ...
- 转:git windows中文 乱码问题解决汇总
it的Windows版本Msysgit对中文的支持不够好 .当使用时,会出现以下三种情况的中文乱码: 下面的几个文件都在git安装目录下文件夹etc内.1.ls不能显示中文目录 解决办法:在git/g ...
- [置顶] Android4.0中修改挂断键(ENDCALL)的默认行为
文件: frameworks/base/core/java/android/provider/Setings.java public static final String END_BUTTON_BE ...
- Agg vs. Cairo 二维绘图引擎之比较和选择 .
Agg vs. Cairo 二维绘图引擎之比较和选择 cheungmine 当今时代对于作为二维图形软件开发者, 是幸运的.因为除了Windows GDI/GDI+之外,我们还有很多其他的选择.而且这 ...
- 公司需求知识学习-WCF
一.概述 Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口,可以翻译为Windows通讯接口,它是.NET框架的一部分.由 .NE ...
- BZOJ 1112: [POI2008]砖块Klo1112( BST )
枚举每个长度为k的区间, 然后用平衡树找中位数进行判断, 时间复杂度O(nlogn). 早上起来精神状态不太好...连平衡树都不太会写了...果断去看了会儿番然后就A了哈哈哈 ------------ ...
- ASP漏洞+SQL注入的入侵方法
本文就是想对装上了防火墙的主机,进行入侵攻击的大概思路小结一下. 首先当然是用扫描器对这台服务器(以下简称主机A)进行常规的扫描,得到初步的信息.再用nmap -sS IP -P0 -p 139 ,透 ...