package com.han.csv.util; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.InputStreamReader; import java.util.ArrayList; public class CSVFileUtil { // CSV文件编码 public static final String ENCODE = "UTF-8"; private FileInputStream fis = null; private InputStreamReader isw = null; private BufferedReader br = null; public CSVFileUtil(String filename) throws Exception { fis = new FileInputStream(filename); isw = new InputStreamReader(fis, ENCODE); br = new BufferedReader(isw); } // ==========以下是公开方法============================= /** * 从CSV文件流中读取一个CSV行。 * * @throws Exception */ public String readLine() throws Exception { StringBuffer readLine = new StringBuffer(); boolean bReadNext = true; while (bReadNext) { // if (readLine.length() > 0) { readLine.append("\r\n"); } // 一行 String strReadLine = br.readLine(); // readLine is Null if (strReadLine == null) { return null; } readLine.append(strReadLine); // 如果双引号是奇数的时候继续读取。考虑有换行的是情况。 if (countChar(readLine.toString(), '"', 0) % 2 == 1) { bReadNext = true; } else { bReadNext = false; } } return readLine.toString(); } /** *把CSV文件的一行转换成字符串数组。指定数组长度,不够长度的部分设置为null。 */ public static String[] fromCSVLine(String source, int size) { ArrayList tmpArray = fromCSVLinetoArray(source); if (size < tmpArray.size()) { size = tmpArray.size(); } String[] rtnArray = new String[size]; tmpArray.toArray(rtnArray); return rtnArray; } /** * 把CSV文件的一行转换成字符串数组。不指定数组长度。 */ public static ArrayList fromCSVLinetoArray(String source) { if (source == null || source.length() == 0) { return new ArrayList(); } int currentPosition = 0; int maxPosition = source.length(); int nextComma = 0; ArrayList rtnArray = new ArrayList(); while (currentPosition < maxPosition) { nextComma = nextComma(source, currentPosition); rtnArray.add(nextToken(source, currentPosition, nextComma)); currentPosition = nextComma + 1; if (currentPosition == maxPosition) { rtnArray.add(""); } } return rtnArray; } /** * 把字符串类型的数组转换成一个CSV行。(输出CSV文件的时候用) */ public static String toCSVLine(String[] strArray) { if (strArray == null) { return ""; } StringBuffer cvsLine = new StringBuffer(); for (int idx = 0; idx < strArray.length; idx++) { String item = addQuote(strArray[idx]); cvsLine.append(item); if (strArray.length - 1 != idx) { cvsLine.append(','); } } return cvsLine.toString(); } /** * 字符串类型的List转换成一个CSV行。(输出CSV文件的时候用) */ public static String toCSVLine(ArrayList strArrList) { if (strArrList == null) { return ""; } String[] strArray = new String[strArrList.size()]; for (int idx = 0; idx < strArrList.size(); idx++) { strArray[idx] = (String) strArrList.get(idx); } return toCSVLine(strArray); } // ==========以下是内部使用的方法============================= /** *计算指定文字的个数。 * * @param str 文字列 * @param c 文字 * @param start 开始位置 * @return 个数 */ private int countChar(String str, char c, int start) { int i = 0; int index = str.indexOf(c, start); return index == -1 ? i : countChar(str, c, index + 1) + 1; } /** * 查询下一个逗号的位置。 * * @param source 文字列 * @param st 检索开始位置 * @return 下一个逗号的位置。 */ private static int nextComma(String source, int st) { int maxPosition = source.length(); boolean inquote = false; while (st < maxPosition) { char ch = source.charAt(st); if (!inquote && ch == ',') { break; } else if ('"' == ch) { inquote = !inquote; } st++; } return st; } /** * 取得下一个字符串 */ private static String nextToken(String source, int st, int nextComma) { StringBuffer strb = new StringBuffer(); int next = st; while (next < nextComma) { char ch = source.charAt(next++); if (ch == '"') { if ((st + 1 < next && next < nextComma) && (source.charAt(next) == '"')) { strb.append(ch); next++; } } else { strb.append(ch); } } return strb.toString(); } /** * 在字符串的外侧加双引号。如果该字符串的内部有双引号的话,把"转换成""。 * * @param item 字符串 * @return 处理过的字符串 */ private static String addQuote(String item) { if (item == null || item.length() == 0) { return "\"\""; } StringBuffer sb = new StringBuffer(); sb.append('"'); for (int idx = 0; idx < item.length(); idx++) { char ch = item.charAt(idx); if ('"' == ch) { sb.append("\"\""); } else { sb.append(ch); } } sb.append('"'); return sb.toString(); } }
Java读取CSV的常用方法
[url]http://blog.csdn.net/hantiannan/article/details/6756347 [/url]
猜你喜欢
转载自qtlkw.iteye.com/blog/2254260
今日推荐
周排行