源码:
import java.io.*;
import java.util.*;
//给定一个含有csv格式的字符串,读取其中的信息
public class readcsv {
//格式字符串
private static char c0=',';
//字典字符串
private static String s0=":";
//调用函数,读取文件,并返回列表
public static ArrayList<Object> read(File file) {
ArrayList<Object> list;
String s=readfile(file);
s=check(s);
list=new ArrayList<Object>(Arrays.asList(split(s)));
readcsv1(list);
return list;
}
//调用函数,读取字符串,并返回列表
public static ArrayList<Object> read(String s){
ArrayList<Object> list;
s=check(s);
list=new ArrayList<Object>(Arrays.asList(split(s)));
readcsv1(list);
return list;
}
//读取文件,生成待处理字符串
private static String readfile(File file) {
String s=null;
try{
FileInputStream fis=new FileInputStream(file);
s=new String(fis.readAllBytes());
s=s.replace("\"", "");
fis.close();
}catch(Exception e) {
e.printStackTrace();
}
return s;
}
//检查字符串中满足条件的子串并返回
private static String check(String s) {
int count1=0,count2=0,count3=0,count4=0;
int start=0,end=0;
for(int i=0;i<s.length();i++) {
char c=s.charAt(i);
if(c=='[') {
count1++;
if(count1==1)
start=i;
}
else if(c==']')
count2++;
else if(c=='{')
count3++;
else if(c=='}')
count4++;
if(count1<count2||count3<count4) {
System.out.println("格式不正确");
break;
}
else if(count1==count2&&count1!=0) {
end=i;
break;
}
}
s=s.substring(start+1,end);
return s;
}
//如果字符串某一位置是'['或者'{',计算与其对应的']'或者'}'的位置。
private static int count(String s,int k) {
char c1,c2;
int count1=0,count2=0;
int mark=0;
if(s.charAt(k)=='[') {
c1='[';c2=']';
}
else if(s.charAt(k)=='{') {
c1='{';c2='}';
}
else {
c1=0;c2=0;
System.out.println("charException");
}
for(int i=k;i<s.length();i++) {
char cc=s.charAt(i);
if(cc==c1)
count1++;
else if(cc==c2)
count2++;
if(count1==count2) {
mark=i;break;
}
}
return mark;
}
//利用字符变量c0分割字符串,并且跳过被"{}"或者"[]"包围的字符串。
private static String[] split(String s) {
ArrayList<Integer> list=new ArrayList<>();
list.add(-1);
for(int i=0;i<s.length();i++) {
char c=s.charAt(i);
if(c=='['||c=='{')
i=count(s,i)-1;
else if(c==c0)
list.add(i);
}
list.add(s.length());
//System.out.println(list);
String[] strs=new String[list.size()-1];
for(int i=0;i<strs.length;i++)
strs[i]=s.substring(list.get(i)+1,list.get(i+1));
return strs;
}
//把被'[]'包围的字符串变成List
private static ArrayList<Object> genelist(String s){
ArrayList<Object> list=null;
if(s.charAt(0)=='['&&s.charAt(s.length()-1)==']') {
String s1=s.substring(1,s.length()-1);
list=new ArrayList<Object>(Arrays.asList(split(s1)));
}
else {
System.out.println("格式不正确");
}
return list;
}
//把被'{}'包围的字符串变成Map
private static TreeMap<String,Object> genemap(String s){
TreeMap<String,Object> map=null;
if(s.charAt(0)=='{'&&s.charAt(s.length()-1)=='}') {
map=new TreeMap<String,Object>();
String s1=s.substring(1,s.length()-1);
if(s1.length()>0) {
String[] ss=split(s1);
for(String s2:ss) {
String[] ss1=s2.split(s0,2);
map.put(ss1[0], ss1[1]);
}
}
}
else {
System.out.println("格式不正确");
}
return map;
}
//判断一个字符串是不是被'[]'或者'{}'包围
private static int jud(String s) {
int i=0;
char c1=s.charAt(0);
char c2=s.charAt(s.length()-1);
if(c1=='['&&c2==']')
i=1;
else if(c1=='{'&&c2=='}')
i=2;
return i;
}
//读取类csv文件
private static void readcsv1(ArrayList<Object> list) {
for(int i=0;i<list.size();i++) {
String s=(String)list.get(i);
if(s.length()>0) {
int k=jud(s);
if(k==1) {
ArrayList<Object> list1=genelist(s);
readcsv1(list1);
list.set(i, list1);
}
else if(k==2) {
TreeMap<String,Object> map1=genemap(s);
readcsv2(map1);
list.set(i, map1);
}
}
}
}
//读取类csv文件
private static void readcsv2(TreeMap<String,Object> map) {
Set<String> set=map.keySet();
for(String s1:set) {
String s=(String)map.get(s1);
if(s.length()>0) {
int k=jud(s);
if(k==1) {
ArrayList<Object> list1=genelist(s);
readcsv1(list1);
map.put(s1, list1);
}
else if(k==2) {
TreeMap<String,Object> map1=genemap(s);
readcsv2(map1);
map.put(s1, map1);
}
}
}
}
}
两个例子:
String s="[456,[wo],[ai],[ni],[[zhong],guo,[haha],gege],123]";
String s1="[4,5,6,[7,[{9:10,11:12,13:[14,15]},{16:{17:18}}],8],[],[],1,2,3]";
ArrayList<Object> list=readcsv.read(s);
ArrayList<Object> list1=readcsv.read(s1);
for(int i=0;i<list.size();i++)
System.out.println(list.get(i));
System.out.println();
for(int i=0;i<list1.size();i++)
System.out.println(list1.get(i));
运行结果:
456
[wo]
[ai]
[ni]
[[zhong], guo, [haha], gege]
123
4
5
6
[7, [{11=12, 13=[14, 15], 9=10}, {16={17=18}}], 8]
[]
[]
1
2
3