1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package com.isenshi.util;
17
18 import java.io.BufferedReader;
19 import java.io.IOException;
20 import java.io.InputStream;
21 import java.io.InputStreamReader;
22 import java.io.Reader;
23 import java.io.UnsupportedEncodingException;
24 import java.util.ArrayList;
25 import java.util.Iterator;
26 import java.util.List;
27
28 import org.seasar.tuigwaa.system.Constants;
29
30
31 /***
32 * @author someda
33 */
34 public class CSVParser implements Iterator{
35
36 private BufferedReader br;
37 private String currentLine;
38
39 private static final char QUOTEMARK = '\"';
40 private static final char DELIMITER = ',';
41
42 private static final String DEFAULT_ENCODING = "Windows-31J";
43
44 public CSVParser(InputStream is){
45 try{
46 br = new BufferedReader(new InputStreamReader(is,DEFAULT_ENCODING));
47 }catch(UnsupportedEncodingException uee){
48 }
49 }
50
51 public CSVParser(Reader reader){
52 br = new BufferedReader(reader);
53 }
54
55
56 public void remove() {
57
58 }
59
60 public boolean hasNext() {
61 return getNextLine() != null;
62 }
63
64 public Object next() {
65 return parse(currentLine);
66 }
67
68
69 private String getNextLine(){
70 try{
71 currentLine = br.readLine();
72 }catch(IOException ioe){
73 currentLine = null;
74 }
75 return currentLine;
76 }
77
78 private String[] parse(String line){
79 if(line == null) return null;
80
81 List wordList = new ArrayList();
82 StringBuffer buf = new StringBuffer();
83 boolean inword = false;
84
85
86 boolean appendCharacter = false;
87
88 do {
89 if (buf.length() > 0) {
90 buf.append(Constants.LINEBREAK_CODE);
91 line = getNextLine();
92 if (line == null)
93 break;
94 }
95
96 int size = line.length();
97
98 for (int i = 0; i < size; i++) {
99 char c = line.charAt(i);
100 if (c == QUOTEMARK) {
101 int num = lookahead(i,line);
102 i = i + num;
103 if(num >= 0 && num % 2 == 0){
104 inword = !inword;
105 }
106 for(int j=0; j<(num+1)/2 ; j++){
107 buf.append(QUOTEMARK);
108 }
109 } else if (c == DELIMITER && !inword) {
110 wordList.add(getAppendString(appendCharacter,buf.toString()));
111 appendCharacter = false;
112 buf = new StringBuffer();
113 } else {
114 buf.append(c);
115 appendCharacter = true;
116 }
117 }
118
119 } while (inword);
120 wordList.add(getAppendString(appendCharacter,buf.toString()));
121
122 return (String[]) wordList.toArray(new String[wordList.size()]);
123 }
124
125 /***
126 * shows how many QUOTEMARK exists, from current i position,
127 */
128 private static int lookahead(int i, String line){
129
130 int nextidx = i + 1;
131
132 if(nextidx == line.length()){
133 return 0;
134 }else if(line.charAt(nextidx) == QUOTEMARK){
135 return 1+ lookahead(nextidx,line);
136 }else{
137 return 0;
138 }
139 }
140
141 private String getAppendString(boolean appendCharacter, String str){
142 String ret = str;
143
144 if(!appendCharacter){
145 if(str.length() <= 1){
146 ret = "";
147 }else{
148 ret = str.substring(1);
149 }
150 }
151 return ret;
152 }
153
154 }