日韩天天综合网_野战两个奶头被亲到高潮_亚洲日韩欧美精品综合_av女人天堂污污污_视频一区**字幕无弹窗_国产亚洲欧美小视频_国内性爱精品在线免费视频_国产一级电影在线播放_日韩欧美内地福利_亚洲一二三不卡片区

Jsp常用功能CSV文件的生成與分析(2)_JSP教程

編輯Tag賺U幣
教程Tag:暫無Tag,歡迎添加,賺取U幣!

推薦:JSPServletJSF自定義標(biāo)簽
jsp自定義標(biāo)簽的定義步驟: 創(chuàng)建標(biāo)記處理器 創(chuàng)建TLD文件 編輯web.xml 在JSP頁面中使用此標(biāo)簽 模板無憂 在此我們主要討論和學(xué)習(xí)的不是如何開發(fā)自定義標(biāo)簽,所以具體的開發(fā)事例百度

對于2的問題的討論:

如果我們用Excel文件生成CSV文件,其中數(shù)據(jù)有半角逗號,Excel會怎么處理呢?試一下,可以看到類似如下的數(shù)據(jù)。
aaa,bbb,ccc,ddd
aaa2,bbb2,,ddd2
aaa3,bbb3,ccc3,
aaa4,"bb,b4",ccc4,ddd4
bb,b4被用雙引號包圍了,這樣,我們自己在生成CSV文件的時候,可以模仿EXCEL的操作,把所有的數(shù)據(jù)都用雙引號包圍。這時候又出現(xiàn)一個問題,如果數(shù)據(jù)中有雙引號,會怎么樣?再次嘗試一下。這次輸入的數(shù)據(jù)是bb,b"4",結(jié)果是:
aaa,bbb,ccc,ddd
aaa2,bbb2,,ddd2
aaa3,bbb3,ccc3,
aaa4,"bb,b""4""",ccc4,ddd4
雙引號被用2個雙引號替換了。Excel是這么處理的,我們在生成Excel文件的時候可以模仿處理。這樣分析數(shù)據(jù)的時候,就要有一個嚴(yán)格的算法來進(jìn)行分析。
由于做的這個類是給web開發(fā)用的,我們可以考慮用web常用的轉(zhuǎn)意,將"這個字符轉(zhuǎn)換成"來避免這樣的沖突,這樣處理的好處是分析字符串的時候,處理簡單化了。但是這又引發(fā)了別的問題,就是如果數(shù)據(jù)中原來就有"這樣的字符,在將"反轉(zhuǎn)義為"的時候,容易把這些原有的字符也轉(zhuǎn)化了。所以&符號也需要轉(zhuǎn)義。
現(xiàn)在將2個方法折衷,即CSV數(shù)據(jù)以半角逗號分隔,以"包圍。數(shù)據(jù)中的&,"符號進(jìn)行轉(zhuǎn)義。
這樣的處理,將分析數(shù)據(jù)的算法難度降低,同時也解決了數(shù)據(jù)中含有半角逗號,引號的問題。

經(jīng)過以上的分析,我們可以寫CSV生成分析文件的類了。
首先,寫出簡單的轉(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();
}
}
}

分享:Jsp常用技巧圖片驗證碼
思路: 圖片驗證碼的實現(xiàn)主要的技術(shù)點是如何生成一個圖片。生成圖片可以使用java.awt包下的類來實現(xiàn)。我們先寫一個簡單的生成圖片的程序HelloImage.java。以下是代碼部分。 package

來源:模板無憂//所屬分類:JSP教程/更新時間:2008-08-22
相關(guān)JSP教程