CSV文件介绍

 CSV文件介绍

简介
CSV全称 Comma Separated values,是一种用来存储数据的纯文本
文件格式,通常用于电子表格或数据库软件。

规则

0 开头是不留空,以行为单位。
1 可含或不含列名,含列名则居文件第一行。
2 一行数据不垮行,无空行。
3 以半角符号,作分隔符,列为空也要表达其存在。
4 列内容如存在,,则用“”包含起来。
5 列内容如存在“”则用“”“”包含。
6 文件读写时引号,逗号操作规则互逆。
7 内码格式不限,可为ASCII、Unicode或者其他。


CSV文件的生成与分析 



CSV文件是指Excel可以识别的后缀名为CSV的文件,网站系统后台用来存储分析数据的时候有可能会用到它。其实CSV文件的读取和做成比较简单,主要的技术点是文件的读写。不过CSV文件的分析和生成有一定的代表性,可以通过对CSV文件的生成和分析的实现,来了解后台处理批量数据的简单思路。

打开Excel,新建一个文件,在里面随便输入一些数据,然后另存为一个CSV文件,再次用Excel打开的时候,发现只有一个sheet。用一个记事本打开这个文件,可以看到类似如下的数据。
aaa,bbb,ccc,ddd
aaa2,bbb2,,ddd2
aaa3,bbb3,ccc3,
aaa4,bbb4,ccc4,ddd4

仔细观察数据,可以确定以下几点:

CSV文件是文本型文件(非二进制)
文件中的一行在Excel中显示的一行
同一行中的数据用半角逗号分隔
发现以上的规律,我们可以自己也生成一个CSV文件。也可以简单的分析CSV文件。
现在给CSV文件的生成和分析写个简单的例子。(如果对文件处理类不熟悉,可以看一下java的文件处理,或者看一下JDK中关于java.io.File类的帮助信息)
生成CSV文件。(HelloCsvCreater.java)
Java代码 复制代码  收藏代码
  1.   
  2. package com.vogoal.test;   
  3. import java.io.FileWriter;   
  4. import java.io.IOException;   
  5. /**  
  6. * @author SinNeR  
  7.  
  8. * create a CSV file  
  9. */  
  10. public class HelloCsvCreater {   
  11.     public static void main(String[] args) {   
  12.         try {   
  13.             FileWriter fw = new FileWriter("C:\\helloCsv.csv");   
  14.             fw.write("aaa,bbb,ccc,ddd,eee,fff,ggg,hhh\r\n");   
  15.             fw.write("aa1,bb1,cc1,dd1,ee1,ff1,gg1,hh1\r\n");   
  16.             fw.write("aaa\r\n");   
  17.             fw.write("aa2,bb2,cc2,dd2,ee2,ff2,gg2,hh2\r\n");   
  18.             fw.close();   
  19.         } catch (IOException e) {   
  20.             e.printStackTrace();   
  21.         }   
  22.     }   
  23. }  
package com.vogoal.test;
import java.io.FileWriter;
import java.io.IOException;
/**
* @author SinNeR
* 
* create a CSV file
*/
public class HelloCsvCreater {
    public static void main(String[] args) {
        try {
            FileWriter fw = new FileWriter("C:\\helloCsv.csv");
            fw.write("aaa,bbb,ccc,ddd,eee,fff,ggg,hhh\r\n");
            fw.write("aa1,bb1,cc1,dd1,ee1,ff1,gg1,hh1\r\n");
            fw.write("aaa\r\n");
            fw.write("aa2,bb2,cc2,dd2,ee2,ff2,gg2,hh2\r\n");
            fw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

这个类编译后运行,可以看到在C盘根目录下生成了一个名字为helloCsv.csv的CSV文件,双击打开,如下的样子。

分析CSV文件

Java代码 复制代码  收藏代码
  1. package com.vogoal.test;   
  2. import java.io.BufferedReader;   
  3. import java.io.FileInputStream;   
  4. import java.io.IOException;   
  5. import java.io.InputStreamReader;   
  6. /**  
  7. * @author SinNeR  
  8.  
  9. * analysis a CSV file  
  10. */  
  11. public class HelloCSVAnalysis {   
  12.     public static void main(String[] args) {   
  13.         InputStreamReader fr = null;   
  14.         BufferedReader br = null;   
  15.         try {   
  16.             fr = new InputStreamReader(new FileInputStream(   
  17.                     "C:\\helloCsv.csv"));   
  18.             br = new BufferedReader(fr);   
  19.             String rec = null;   
  20.             String[] argsArr = null;   
  21.             while ((rec = br.readLine()) != null) {   
  22.                 System.out.println(rec);   
  23.                 argsArr = rec.split(",");   
  24.                 for (int i = 0; i < argsArr.length; i++) {   
  25.                     System.out.println("num " + (i + 1) + ":" + argsArr[i]);   
  26.                 }   
  27.             }   
  28.         } catch (IOException e) {   
  29.             e.printStackTrace();   
  30.         }finally{   
  31.             try{   
  32.                 if ( fr != null )   
  33.                     fr.close();   
  34.                 if ( br != null )   
  35.                     br.close();   
  36.             }catch(IOException ex){   
  37.                 ex.printStackTrace();   
  38.             }   
  39.         }   
  40.     }   
  41. }  
package com.vogoal.test;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* @author SinNeR
* 
* analysis a CSV file
*/
public class HelloCSVAnalysis {
    public static void main(String[] args) {
        InputStreamReader fr = null;
        BufferedReader br = null;
        try {
            fr = new InputStreamReader(new FileInputStream(
                    "C:\\helloCsv.csv"));
            br = new BufferedReader(fr);
            String rec = null;
            String[] argsArr = null;
            while ((rec = br.readLine()) != null) {
                System.out.println(rec);
                argsArr = rec.split(",");
                for (int i = 0; i < argsArr.length; i++) {
                    System.out.println("num " + (i + 1) + ":" + argsArr[i]);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            try{
                if ( fr != null )
                    fr.close();
                if ( br != null )
                    br.close();
            }catch(IOException ex){
                ex.printStackTrace();
            }
        }
    }
}

这里将刚才生成的csv文件读取并分析。编译后运行,正常情况下,可以看到刚才生成的CSV文件的内容。

至此,CSV文件的生成与分析其实已经完成。如果要写适合自己需要的CSV文件分析类,完全可以根据自己的业务逻辑和需要来自己实现。因为CSV文件的分析确实很简单。

不过上面的程序还是存在一些问题的。这些问题在开发的过程中应当注意,不然可能出现致命的错误。

比较2个类中对资源的释放问题。CSV生成类中FileWriter对象的关闭(close()方法)是在try中执行的。而CSV分析类中InputStreamReader,BufferedReader对象的关闭(close()方法)是在finally中执行的。CSV生成类是错误的。因为在文件和流的生成过程中,是有可能产生IO异常的,如果在对象close前发生IO异常,那么close方法永远不会被调用,这样资源不会及时释放,会产生致命错误的。而在finally中的程序,是一定会被执行的语句,所以即使操作中途发生问题,也会在最后执行close方法。(try-catch-finally是java语法中基本而重要的部分,不熟悉的可查阅相关资料。)
在CSV文件的操作过程中,我们是按照半角逗号来分隔数据的,如果某个数据中正好有半角逗号,那么数据不是出错了?
如果分析的数据有全角字符,是否能够正确分析。(乱码问题)
以上的第二个问题时必须考虑的。在写一个类的时候,不要相信这个类要操作的数据或者得到的数据是好数据(完全符合要求的正确的数据),写好的一个类用完全正确的数据测试完,很有可能一个小小的数据错误的问题,就有可能导致程序处理崩溃。所以,细节问题要充分考虑并对应到,使自己编写的类具有一定的健壮性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值