62,620
社区成员
发帖
与我相关
我的任务
分享
public static void main(String args[]){
BufferedReader br = new BufferedReader(new FileReader("file+dir"));
String titleLine = br.readLine();
String titles [] = titleLine.split("\t|\,");
StringDataReader reader = new StringDataReader(br);
String datas [] = null;
int index = 0;
try{
for(String data = null;(data=reader.readData())!=null;){
if(datas==null){datas = new String[titles.length];index=0;}
datas[index++]=data;
if(index>=titles.length){dealRecord(datas);datas=null;}
}
}catch(Exception e){e.printStackTrace();}
}
private static void dealRecord(String datas[]){
for(int i=0;i<datas.length;){
System.out.print(datas[i++]+"\t");
if(i>=datas.length)System.out.println();
}
}
/**
我有一个数据文件要处理,文件的数据是逗号分割,但是数据内容本身可能有逗号(当然数据中的逗号有双引号包围的),数据也可能换行,比如:
11,23,34,"df,sd
sdsfsdsd,sdsd
sdsd",23
这个数据有五个字段,处理起来很头痛呀
哪位大侠有高招?
*/
//package com.ricky.www;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.ArrayList;
public class Test{
public static void main(String[] args){
String content = "11,23,34,\"df,sd\nsdsfsdsd,sdsd\nsdsd\",23";
int i = 1;
for(Object str : getArray(content).toArray()){
System.out.println(i ++ + " : " + str);
}
}
public static ArrayList<String> getArray(String content){
ArrayList<String> list = new ArrayList<String>();
//分两种情况来分析,一种是"fdfdf,dfdf"的,一种是不包含引号dfjdfd,dfkdf的(当然这里可能存在更加复杂的比如:dlfjd"dfd,fdf"
// ,这里暂不做讨论,如果有需要可以直接联系我)
String regex = "((\"[^\"]*\")|([^\",]+)),?";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(content);
while(matcher.find()){
list.add(matcher.group(1));
}
return list;
}
}
public static void main(String args[]){
String str = "11,23,34,\"df,sd";
str+="sdsfsdsd,sdsd";
str+="sdsd\",23";
System.out.println(str);
StringBuffer sb= new StringBuffer();
java.util.regex.Pattern p=java.util.regex.Pattern.compile("(\"[^\"]+\")",java.util.regex.Pattern.DOTALL) ;
java.util.regex.Matcher m=p.matcher(str);
while(m.find()){
m.appendReplacement(sb,m.group(1).replace(',','¤'));
}
m.appendTail(sb);
System.out.println();
String arr[]=sb.toString().split(",");
for(int i=0;i<arr.length;i++){
arr[i]=arr[i].replace('¤',',');
}
System.out.println(java.util.Arrays.toString(arr));
}
package houlei.csdn.java.io;
import java.io.IOException;
import java.io.Reader;
/**
* @author 侯磊
*/
public class StringDataReader extends java.io.Reader{
private static final char separatorChar = ',';
private static final char escapeChar = '"';
private Reader in;
private boolean hasEscapeChar = false;
public StringDataReader(Reader in) {
this.in = in;
}
@Override
public int read(char[] cbuf, int off, int len) throws IOException {
return in.read(cbuf, off, len);
}
@Override
public void close() throws IOException {
in.close();
}
public synchronized String readData() throws IOException{
StringBuilder buff = new StringBuilder();
char [] oneChar = new char[1];
hasEscapeChar = false;
int count = 0;
while(true){
count = in.read(oneChar);
if(count!=1)return null;
if(oneChar[0]==escapeChar){
hasEscapeChar = !hasEscapeChar;
continue;
}
if(!hasEscapeChar){
if(oneChar[0]==separatorChar){
break;
}
}
buff.append(oneChar);
}
return buff.toString();
}
public static void main(String args []){
String str = "11,23,34,\"df,sd\nsdsfsdsd,sdsd\nsdsd\",23";
java.io.StringReader reader = new java.io.StringReader(str);
StringDataReader sdr = new StringDataReader(reader);
String data = null;
try {
while ((data = sdr.readData()) != null) {
System.out.println("["+data+"]");
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
}