以小白眼光观java世界

Hello World,今天要写的是在我工作中遇到的问题,来先解释一下什么是.csv文件(此处百度的啦),csv(逗号分隔值文件格式),其文件以纯文本形式存储表格数据(数字和文本),一般我是用Excel打开的,然后在工作中我得到了这么一个csv文件,关键在于这个csv文件比较大,一般的csv文件能够存储的最大行数为1048576行的数据,然而我拿到的这个csv显示如下:数据长度超出工作表外,会丢失部分数据

看图片左下角也就打开了48%的数据,也就是说,这个csv文件至少有两百多万行的数据,一个csv文件显示不全,刚好最近在学习java的io流可以读写文件,然后就产生了写一个程序把这个csv文件分割成多个csv文件的想法(事先说明网上有很多这种csv文件切割的程序,我先下载了一个完成工作)。

这个过程有点曲折吧,遇到了编码格式等的问题,然后网上各种查,过程就不多说了,说结果吧,使用io流BufferedInputStream和BufferedOutputStream可以实现,不过好像比较麻烦,网上有专门读写csv文件的javacsv包,然后我就下载了一个 “javacsv-2.1.jar” 包(用 “opencsv-4.2.jar” 这个包也可以,也需要下载),使用CsvReader和CsvWriter来读写csv文件。

现在来看看我写的程序吧,

这个部分是从控制台输入文件绝对路径,然后进行判断1、路径是否存在。2、输入的路径是不是文件夹路径。3、这个文件是不是.csv文件。通过这三个判断可以确定你输入的csv文件有效,然后执行后续动作。

以下为主要的程序

请忽略以上程序我写的比较复杂,能实现功能就好了。

程序说明:

1、我先定义了一个int型的num用来记录行数,每读写一百万次的数据后就换一个新的csv文件写进去

2、我要读的这个csv文件大概有两百多万行,所以我定义了三个csv文件用来存数据,每个csv文件最多一百万行数据,当然包括表头的话每个csv文件最多一百零一行的数据

3、cr.readHeaders()这个后面我有注释的,写了这句话就是不包含第一行表头,我在这里写是因为我在后面用String保存了一个表头,每次要写新csv文件的时候就先把表头写在第一行,这样每个csv文件都有表头了。

4、write()括号里写的是字符串String, writeRecord()括号里写的是字符串数组String[]

5、cw1.endRecord()是跳到下一行,用write()写是不会自动跳到新的一行的,所以需要endRecord(),类似于io流中的newLine()

6、cw1.writeRecord(cr.getRawRecord().split(","),true);//以逗号进行分割,遇到逗号就跳到后面一个单元格,用公司导出的csv文件实测还有引号,而且数据也有问题(如下图所示),所以不行,自己写的csv文件可以用这个方法写进去数据没有问题

7、我用write()写进去数据还有一点小瑕疵,就是它一行都在一格里面(如下图),这个很好解决,用Excel自带的分列功能就完美解决了。

8、此程序优化空间还很大,我......

9、仅供参考

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180621G1AVF000?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券