下面这个字符行,其中以""做分割的是字符串,没有""的是数字,逗号作为分隔符。"a","bc","d0","9.3","java,c++,vb",9,6.2,"inter"face"blank"分割出来的元素是:
a
bc
d0
9.3
java,c++,vb
9
6.2
inter"face"blank求能够实现这样分割的代码。(上面这个字符行只是一个示例,有很多这种格式的字符行等待处理)
分割出来的元素都放在一个数据结构中。
a
bc
d0
9.3
java,c++,vb
9
6.2
inter"face"blank求能够实现这样分割的代码。(上面这个字符行只是一个示例,有很多这种格式的字符行等待处理)
分割出来的元素都放在一个数据结构中。
楼主【zhaolinger2】截止到2008-07-18 10:38:34的历史汇总数据(不包括此帖):
发帖的总数量:16 发帖的总分数:630 每贴平均分数:39
回帖的总数量:70 得分贴总数量:16 回帖的得分率:22%
结贴的总数量:15 结贴的总分数:530
无满意结贴数:1 无满意结贴分:20
未结的帖子数:1 未结的总分数:100
结贴的百分比:93.75 % 结分的百分比:84.13 %
无满意结贴率:6.67 % 无满意结分率:3.77 %
值得尊敬
String s[]=str.split(",");
然后String str=..
String s[]=str.split(",");
看啦只能用遍历的方法一个一个char按条件然后分割
1.如果是‘"’的判断前一个或者后一个是否是‘,’如果是去掉,不是保留。
2.如果是‘,’就判断前一个和后一个是不是‘"’,如果是去掉或者替换成另外一个不会出现的特殊符合,不是保留。这样你可以根据判断生成每个字符串或者按替换后的特殊符号做分割。
String data = "\"a\",\"bc\",\"d0\",\"9.3\",\"java,c++,vb\",9,6.2,\"inter\"face\"blank\"";
// \s\,\s|\"\s\,\s|\s\,\s\"|\"\s\,\s\"
String[] sa = data.split("(\\\"\\s*\\,\\s*\\\")|(\\\"\\s*\\,\\s*)|(\\s*\\,\\s*\\\")|(\\s*\\,\\s*)|(\\s*\\\")|(\\\"\\s*)");
for (String s : sa) {
System.out.println(s);
}
}}
如果你的字符串中没有"inter"face"blank" 这个鬼怪东西出现,就是说不出现双引号里面包含双引号的情况。我倒是有个很好的方法可以帮助分解。
例如:对这个"a","bc","d0","9.3","java,c++,vb",9,6.2 字符串
Pattern p = Pattern.compile("(\")[^\"]*\\1(?=,)?|(\\d+\.{0,1}\\d*)(?=,)?");
Matcher m = p.matcher("\"a\",\"bc\",\"d0\",\"9.3\",\"java,c++,vb\",9,6.2");
//这里得到的字符串就是 "a" "bc" 等等 ,数字是9 6.2
while(m.find()){
String s=m.group();
//看看如果是引号开头,则去头去尾
if(s.indexOf("\"")){
s=s.substring(1,s.length()-1);
}
System.out.println(s);
}
try {
String string = "\"a\",\"bc\",\"d0\",\"9.3\",\"java,c++,vb\",9,6.2,\"inter\"face\"blank\"";
String[] arr = string.split("^\"|\"?,(\"|(?=\\d))|\"$");
String[] arr2 = new String[arr.length - 1];
System.arraycopy(arr, 1, arr2, 0, arr.length - 1);
for (String string2 : arr2) {
System.out.println(string2);
} } catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
bc
d0
9.3
java,c++,vb
9
6.2
inter"face"blank
ArrayList list = new ArrayList();//这个表示楼主要保存的那个数据结构.
String sa [] = string.split("\,");
for(int i=0;i<sa.length;i++){
if(sa[i].charAt(0)=='"' && sa[i].charAt(sa[i].length()-1)=='"'){
list.add(sa[i].substring(1,sa[i].length()));
}else{
list.add(Float.valueOf(sa[i]));
}
}
//这样list就是分隔后的结果了.数字是用Float对象来保存的.
我是这样实现的, public static void do10(){
String tempstr="";
String str ="\"a\",\"bc\",\"d0\",\"9.3\",\"java,c++,vb\",9,6.2,\"inter\"face\"blank\"";
Pattern pattern = Pattern.compile("\"([^\"]+)\"",Pattern.CASE_INSENSITIVE|Pattern.DOTALL);
Matcher m = pattern.matcher(str);
while(m.find()){
tempstr+=m.group(1)+"#";
}
str=str.replaceAll("\"([^\"]+)\"(,)?","");
String[] a=str.split(",");
for(int i=0;i<a.length;i++){
tempstr+=a[i]+"#";
}
System.out.println(tempstr);
}
public static void do10(){
String tempstr="";
String str ="\"a\",\"bc\",\"d0\",\"9.3\",\"java,c++,vb\",9,6.2,\"inter\"face\"blank\"";
Pattern pattern = Pattern.compile("\"(([^\"]+)\"[^,]*)",Pattern.CASE_INSENSITIVE|Pattern.DOTALL);
Matcher m = pattern.matcher(str);
while(m.find()){
System.out.println(m.group(1));
tempstr+=m.group(1)+"#";
}
str=str.replaceAll("\"(([^\"]+)\"[^,]*)","");
String[] a=str.split(",");
for(int i=0;i<a.length;i++){
tempstr+=a[i]+"#";
}
System.out.println(tempstr);
}
try {
String string = "\"a\",\"bc\",\"d0\",\"-9.3\",\"java,c++,vb\",-9,6.2,\"inter\"face\"blank\"";
String[] arr = string.split("^\"|\"?,(\"|(?=-?\\d))|\"$");
String[] arr2 = null;
if (string.startsWith("\"")) {
arr2 = new String[arr.length - 1];
System.arraycopy(arr, 1, arr2, 0, arr.length - 1);
} else {
arr2 = arr;
}
for (String string2 : arr2) {
System.out.println(string2);
} } catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
public static void do10(){
String tempstr="";
ArrayList list = new ArrayList();
String str ="\"a\",\"bc\",\"d0\",\"9.3\",\"java,c++,vb\",9,6.2,\"inter\"face\"blank\"";
Pattern pattern = Pattern.compile("\"(([^\"]+)\"[^,]*)",Pattern.CASE_INSENSITIVE|Pattern.DOTALL);
Matcher m = pattern.matcher(str);
while(m.find()){
tempstr+=m.group(1)+"#";
list.add(m.group(1));
}
str=str.replaceAll("\"(([^\"]+)\"[^,]*)(,)?","");
String[] a=str.split(",");
for(int i=0;i<a.length;i++){
tempstr+=a[i]+"#";
list.add(a[i]);
}
System.out.println(tempstr);
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
}
2,字段中若有逗号的话,则字段两边放上引号(");
3,字段中若出现引号(")则采用两个引号("")表示,并在字段的两边放上引号(")。
"java","c++","vb" 这样的话就变成三个字段了,实际上需要的是 java","c++","vb因此,你所说的这种格式无解!
"java,c++,vb"
"inter"face"blank"
这两个地方真变态
嗯,如果把 "inter"face"blank" 改成 "inter""face""blank" 这样的话,就是标准的了,就可以处理了。
拿分来了
t1.txt里内容:
"a","bc","d0","9.3","java,c++,vb",9,6.2,"inter"face"blank" FileReader fr = new FileReader("t1.txt");
BufferedReader br = new BufferedReader(fr);
String s = br.readLine();
System.out.println(s);
List<String> list = new ArrayList<String>();
s = "," + s;//便于统计
int count = 0;//统计"的个数
int begin = 0;
boolean b = false;
for(int i = 1; i < s.length(); i++) {
if(s.charAt(i) == '"') {
count++;
if(count % 2 == 1 && s.charAt(i - 1) == ',') {
b = true;//说明该字符处于一个字符串中
}
if((count % 2 == 0 && i < s.length() - 1 && s.charAt(i + 1) == ',') ||
(count % 2 == 0 && i == s.length() - 1)) {
b = false;//一个字符串的结尾
}
}
if(s.charAt(i) == ',' && !b) {//!b说明这个,是一个分隔符
list.add(s.substring(begin + 1, i));
begin = i;
}
}
list.add(s.substring(begin + 1, s.length()));
for(String t : list) {
if(t.charAt(0) == '"') {
t = t.substring(1, t.length() - 1);
}
System.out.println(t);
}执行结果
"a","bc","d0","9.3","java,c++,vb",9,6.2,"inter"face"blank"
a
bc
d0
9.3
java,c++,vb
9
6.2
inter"face"blank
遍历的时候改一下就ok List<Integer> l = new ArrayList<Integer>();
for(int i = 0; i < list.size(); i++) {
String t = list.get(i);
if(t.charAt(0) == '"') {
t = t.substring(1, t.length() - 1);
System.out.println("字符串\t" + t);
}else {
l.add(i);
System.out.println("数字\t" + t);
}
}结果:
"a","bc","d0","9.3","java,c++,vb",9,6.2,"inter"face"blank"
字符串 a
字符串 bc
字符串 d0
字符串 9.3
字符串 java,c++,vb
数字 9
数字 6.2
字符串 inter"face"blank
String a = "\"a\",\"bc\",\"d0\",\"9.3\",\"java,c++,vb\",-9,6.2,\"inter\"face\"blank\",9,\"9.5\"";
System.out.println(a);
int s = 0;
int e = 0;
int x = 0;
String tmp1, tmp2;
ArrayList<String> l = new ArrayList<String>();
while (true) {
x++;
if (x > a.length()) {
break;
} else if ((s = a.indexOf(",\"")) > 0) {
tmp1 = a.substring(0, s + 1);
if ((e = (a.substring(s)).indexOf("\",")) > 0) {
tmp2 = a.substring(s + e + 1);
l.add(a.substring(s + 2, s + e));
System.out.println(a.substring(s + 1, s + e + 1));
a = tmp1 + tmp2;
//
}
} else {
break;
}
}
for (String string : a.split(",")) {
if ("".equals(string)) {
continue;
} else {
if (string.startsWith("\"") && string.endsWith("\"")) {
l.add(string.substring(1, string.length() - 1));
} else l.add(string);
}
}
System.out.println(a);
System.out.println(l);
System.out.println(l.size());
}
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String a = "\"a\",\"bc\",\"d0\",\"9.3\",\"java,c++,vb\",9,6.2,\"inter\"face\"blank\"";
String[] b=a.split(",");
for(int i=0;i<b.length;i++){
if(b[i].startsWith("\"") && b[i].endsWith("\"")){
System.out.println(b[i].substring(1,b[i].length()-1));
}else if( b[i].matches("[0-9].?\\d*")){
System.out.println(b[i]);
}else if(b[i].startsWith("\"")){
System.out.print(b[i].substring(1,b[i].length())+",");
}else if(b[i].endsWith("\"")){
System.out.println(b[i].subSequence(0, b[i].length()-1));
}else{
System.out.print(b[i]+",");
}
}
}
}