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

来源:互联网 发布:apache poi word 编辑:程序博客网 时间:2024/05/22 17:32
  • 什么是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();          }      }  }