CSV文件介绍 及 文件读写工具类

  • 什么是CSV文件

CSV,逗号分隔值文件格式,有时也称为字符分隔值,因为分隔字符也可以不是逗号,其文件以纯文本形式存储表格数据(数字和文本)。纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据。CSV文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符。通常,所有记录都有完全相同的字段序列。通常都是纯文本文件。建议使用WORDPAD或是记事本(NOTE)来开启,再则先另存新档后用EXCEL开启,也是方法之一。

  • 为什么使用CSV

CSV是一种通用的、相对简单的文件格式,被用户、商业和科学广泛应用。最广泛的应用是在程序之间转移表格数据,因为大量程序都支持某种CSV变体。

  • CSV的规则

开头是不留空,以行为单位。 可含或不含列名,含列名则居文件第一行。 一行数据不跨行,无空行。
以半角逗号(即,)作分隔符,列为空也要表达其存在。
列内容如存在半角引号(即”),替换成半角双引号(”“)转义,即用半角引号(即”“)将该字段值包含起来。 文件读写时引号,逗号操作规则互逆。
内码格式不限,可为 ASCII、Unicode 或者其他。 不支持特殊字符

  • 使用技巧

Excel打开时无法正常显示数字字符串

数字字符串会被Excel自动转换成数字类型,长的数字字符串还会被用科学计数法表示,所以存储时可以采用如下方法存储:
=”520101199911110123”
=”2017-01-01 12:22:00”

  • csvUtil 文件读写工具类 (先引入 javacsv-2.0.jar )
import java.io.BufferedOutputStream;  
import java.io.IOException;  
import java.io.InputStream;  
import java.io.OutputStream;  
import java.net.URLEncoder;  
import java.nio.charset.Charset;  
import java.util.ArrayList;  
import java.util.List;  

import com.csvreader.CsvReader;  
import com.csvreader.CsvWriter;  

/*import javax.servlet.http.HttpServletResponse;*/  

public class csvUtil {  
    /** 
     * 读取CSV文件 
     * @param csvFilePath 文件路径 
     */  
    public static ArrayList<String[]> readeCsv(String csvFilePath) {  
        ArrayList<String[]> csvList = new ArrayList<String[]>(); // 用来保存数据  
        try {  
            CsvReader reader = new CsvReader(csvFilePath, ',',Charset.forName("GBK")); // 一般用这编码读就可以了  
            reader.readHeaders(); // 跳过表头 如果需要表头的话,不要写这句。  
            while (reader.readRecord()) { // 逐行读入除表头的数据  
                csvList.add(reader.getValues());  
            }  
            reader.close();  
        } catch (Exception ex) {  
            System.out.println(ex);  
        }  
        return csvList;  
    }  

    /** 
     * 读取CSV文件 
     * @param csvIs csv导入数据流 
     */  
    public static ArrayList<String[]> readeCsvByIs(InputStream csvIs) {  
        ArrayList<String[]> csvList = new ArrayList<String[]>(); // 用来保存数据  
        try {  
            CsvReader reader = new CsvReader(csvIs,Charset.forName("GBK")); // 一般用这编码读就可以了  
            reader.readHeaders(); // 跳过表头 如果需要表头的话,不要写这句。  
            while (reader.readRecord()) { // 逐行读入除表头的数据  
                csvList.add(reader.getValues());  
            }  
            reader.close();  
        } catch (Exception ex) {  
            System.out.println(ex);  
        }  
        return csvList;  
    }  


    /** 
     * 写入CSV文件 
     *  
     * @param csvFilePath 写出路径 
     *  
     * @param contents 数据内容 
     */  
    public static void writeCsv(String csvFilePath ,List<String[]> contents) {  
        try {  
            //String csvFilePath = "c:/test.csv";  
            CsvWriter wr = new CsvWriter(csvFilePath, ',',Charset.forName("GBK"));  
            for (int i = 0; i < contents.size(); i++) {  
                wr.writeRecord(contents.get(i));  
            }  
            wr.close();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }  


     /** 
     * 输出文件 
     * @param ou   文件流 
     * @param list      需要输出的数据 
     * @throws java.io.IOException 
     */  
    public static void writeCsv(OutputStream ou, List<String[]> list) throws IOException {  
        CsvWriter cw = new CsvWriter(ou, ',', Charset.forName("UTF-8"));  
        for(String[] s: list) {  
            cw.writeRecord(s);  
        }  
        //在文件中增加BOM,详细说明可以Google,该处的byte[] 可以针对不同编码进行修改  
        ou.write(new byte[] { (byte) 0xEF, (byte) 0xBB,(byte) 0xBF });  
        cw.flush();  
        cw.close();  
    }  

    /** 
     * 导出csv模板 
     * 
     * @param response 
     * @param headers 模板列标题 
     * @param csvName csv文件名 
     * @throws java.io.IOException 
     */  
    public static void exportCsv(HttpServletResponse response,String headers,String csvName) throws IOException {  
        OutputStream fos = response.getOutputStream();  
        BufferedOutputStream bos = new BufferedOutputStream(fos);  
        try {  
            fos = response.getOutputStream();  
            bos = new BufferedOutputStream(fos);  
            //这个就就是弹出下载对话框的关键代码  
            response.setContentType("text/csv");  
            response.setHeader("Content-disposition","attachment;filename=" +URLEncoder.encode(csvName+".csv", "UTF-8"));  
            headers += "\n";  
            bos.write(headers.getBytes("GBK"));  
            bos.flush();  
        } catch (IOException ex) {  
            System.out.print(ex);  
        } finally {  
            fos.close();  
            bos.close();  
        }  
    }  
}  

猜你喜欢

转载自blog.csdn.net/diyu122222/article/details/78685771
今日推荐