java 匯入csv , 裡面 有“”回車換行等,都可以去掉
阿新 • • 發佈:2019-02-04
http://blog.csdn.net/hantiannan/article/details/6756347
真實好東西, 吧問題都解決了
package com.baishiji.action.taskmenu; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.InputStreamReader; import java.util.ArrayList; public class CSVFileUtil { /** * http://blog.csdn.net/hantiannan/article/details/6756347 */ // CSV檔案編碼 public static final String ENCODE = "GBK"; 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(); } }