對(duì)于2的問題的討論:
如果我們用Excel文件生成CSV文件,其中數(shù)據(jù)有半角逗號(hào),Excel會(huì)怎么處理呢?試一下,可以看到類似如下的數(shù)據(jù)。 aaa,bbb,ccc,ddd aaa2,bbb2,,ddd2 aaa3,bbb3,ccc3, aaa4,"bb,b4",ccc4,ddd4 bb,b4被用雙引號(hào)包圍了,這樣,我們自己在生成CSV文件的時(shí)候,可以模仿EXCEL的操作,把所有的數(shù)據(jù)都用雙引號(hào)包圍。這時(shí)候又出現(xiàn)一個(gè)問題,如果數(shù)據(jù)中有雙引號(hào),會(huì)怎么樣?再次嘗試一下。這次輸入的數(shù)據(jù)是bb,b"4",結(jié)果是: aaa,bbb,ccc,ddd aaa2,bbb2,,ddd2 aaa3,bbb3,ccc3, aaa4,"bb,b""4""",ccc4,ddd4 雙引號(hào)被用2個(gè)雙引號(hào)替換了。Excel是這么處理的,我們?cè)谏蒃xcel文件的時(shí)候可以模仿處理。這樣分析數(shù)據(jù)的時(shí)候,就要有一個(gè)嚴(yán)格的算法來進(jìn)行分析。 由于做的這個(gè)類是給web開發(fā)用的,我們可以考慮用web常用的轉(zhuǎn)意,將"這個(gè)字符轉(zhuǎn)換成"來避免這樣的沖突,這樣處理的好處是分析字符串的時(shí)候,處理簡(jiǎn)單化了。但是這又引發(fā)了別的問題,就是如果數(shù)據(jù)中原來就有"這樣的字符,在將"反轉(zhuǎn)義為"的時(shí)候,容易把這些原有的字符也轉(zhuǎn)化了。所以&符號(hào)也需要轉(zhuǎn)義。 現(xiàn)在將2個(gè)方法折衷,即CSV數(shù)據(jù)以半角逗號(hào)分隔,以"包圍。數(shù)據(jù)中的&,"符號(hào)進(jìn)行轉(zhuǎn)義。 這樣的處理,將分析數(shù)據(jù)的算法難度降低,同時(shí)也解決了數(shù)據(jù)中含有半角逗號(hào),引號(hào)的問題。
經(jīng)過以上的分析,我們可以寫CSV生成分析文件的類了。 首先,寫出簡(jiǎn)單的轉(zhuǎn)意靜態(tài)方法。
public static String CSVEncode(String in){ if ( in == null ) return ""; in.replaceAll("&","&"); in.replaceAll("\"","""); return in; } public static String CSVDecode(String in){ if ( in == null ) return ""; in.replaceAll(""","\""); in.replaceAll("&","&"); return in; }
CSV文件生成類:
package com.vogoal.util.csv; import java.io.FileOutputStream; import java.io.IOException; import com.vogoal.util.UtilCla; /** * @author SinNeR * http://bbs.blueidea.com * * CSVCreater */ public class CSVCreater { private FileOutputStream fos = null; private StringBuffer sb = null; private boolean convertFlag = false; public static final String DEL_CHAR = ","; public static final String AV_CHAR = "\""; public CSVCreater(String arg) throws IOException { fos = new FileOutputStream(arg, false); sb = new StringBuffer(); } public void setData(String data) { if (convertFlag) data = UtilCla.CSVEncode(data); sb.append(AV_CHAR); sb.append(data); sb.append(AV_CHAR); sb.append(DEL_CHAR); } public void setConvertFlag(boolean b) { convertFlag = b; } public void writeLine() { if (sb.charAt(sb.length() - 1) == ',') sb.delete(sb.length() - 1, sb.length()); sb.append("\r\n"); } public void writeDataByLine(String[] args) { for (int i = 0; i < args.length; i++) setData(args[i]); writeLine(); } public void close() throws IOException { try { fos.write(sb.toString().getBytes()); } catch (IOException e) { throw e; } finally { fos.close(); } } public static void main(String[] args) { try { CSVCreater csvCre = new CSVCreater("C:\\test.csv"); csvCre.setConvertFlag(true); csvCre.setData("aaa"); csvCre.setData("aa,a"); csvCre.writeLine(); csvCre.setData("aa\"a"); csvCre.setData("aa,a"); csvCre.setData("aa,a"); csvCre.writeLine(); csvCre.setData("aa\"a"); csvCre.setData("aa,\"a"); csvCre.setData("aa,\"a"); csvCre.setData("aa,\"a"); csvCre.setData("aa,\"a"); csvCre.writeLine(); csvCre.close(); } catch (IOException e) { e.printStackTrace(); } } }
CSV文件分析類:
package com.vogoal.util.csv; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import com.vogoal.util.UtilCla; /** * @author SinNeR * http://bbs.blueidea.com * * CSVAnalysis */ public class CSVAnalysis { private InputStreamReader fr = null; private boolean convertFlag = false; private ArrayList dataContainer = new ArrayList(); public static final String DEL_CHAR = ","; public static final String AV_CHAR = "\""; public CSVAnalysis(String f) throws IOException { fr = new InputStreamReader(new FileInputStream(f)); } public void setConvertFlag(boolean b) { convertFlag = b; } public ArrayList analysis() throws IOException { BufferedReader br = new BufferedReader(fr); String rec = null; try { while ((rec = br.readLine()) != null) { ArrayList alLine = analysisLine(rec); dataContainer.add(alLine); } } catch (IOException e) { throw e; } finally { br.close(); } return dataContainer; } private ArrayList analysisLine(String strLine) { System.out.println(strLine); ArrayList al = new ArrayList(); String[] dataArr = strLine.split(AV_CHAR); for (int i = 1; i < dataArr.length; i = i + 2) { if (convertFlag) al.add(UtilCla.CSVDecode(dataArr[i])); else al.add(dataArr[i]); } return al; } public void close() throws IOException { fr.close(); } public static void main(String[] args) { try { CSVAnalysis csvAna = new CSVAnalysis("C:\\test.csv"); csvAna.setConvertFlag(true); ArrayList al = csvAna.analysis(); for (int i = 0; i < al.size(); i++) { ArrayList al1 = (ArrayList) al.get(i); for (int j = 0; j < al1.size(); j++) { System.out.println(al1.get(j)); } } csvAna.close(); } catch (IOException e) { e.printStackTrace(); } } }
出處:藍(lán)色理想
責(zé)任編輯:moby
上一頁(yè) Jsp常用功能—CSV文件的生成與分析 [1] 下一頁(yè) Jsp常用功能—CSV文件的生成與分析 [3]
◎進(jìn)入論壇網(wǎng)絡(luò)編程版塊參加討論
|