OSDN Git Service

ver 2.23 init
[hayashilib/hayashi.git] / src / jp / co / areaweb / tools / csv / CsvRecord.java
1 package jp.co.areaweb.tools.csv;
2 import java.util.*;
3
4 /**
5  * CSVファイルの1行分のレコードを表す.<br/>
6  * 1行は、Stringオブジェクトのコレクションとして表現する.<br/>
7  * このクラスは通常,CsvFileクラスとセットで利用します.<br/>
8  * 利用方法につては、CsvFileクラスのコメントを参照してください。<br/>
9  *
10  * @author y_hayashi
11  * @version v2.17       2010/01/24
12  * @see jp.co.areaweb.tools.csv.CsvFile
13  * @since 2005/06/01
14  */
15 @SuppressWarnings("serial")
16 public class CsvRecord extends LinkedList<String>
17 {
18         /**
19          * lineで示された文字列を、CSVレコードとして構文解析を行い、自身に取り込む.
20          * 取り込まれたセル文字列は、自信(LinkedList)のアイテムとして格納されます.
21          * 格納順序は、左から順に格納される.
22          * v2.17-2010/01/24より、ダブルクォーテーションで囲まれたセルを処理できるように変更しました。
23          * 自信のアイテムとして格納するときに、前後のダブルクォーテーションは削除されます。
24          * 
25          * @param line  CSVレコード解析を行う文字列行(つまり、CSVの1ライン)
26          */
27         public void analizeRecord(String line) {
28                 this.analizeRecord(line, null);
29         }
30
31         /**
32          * lineで示された文字列を、CSVレコードとして構文解析を行い、自身に取り込む.
33          * 取り込まれたセル文字列は、自信(LinkedList)のアイテムとして格納されます.
34          * 格納順序は、左から順に格納される.
35          * v2.17-2010/01/24より、ダブルクォーテーションで囲まれたセルを処理できるように変更しました。
36          * 自信のアイテムとして格納するときに、前後のダブルクォーテーションは削除されます。
37          * 
38          * @param line  CSVレコード解析を行う文字列行(つまり、CSVの1ライン)
39          * @param split 区切り記号。nullの時は「カンマ(,)」が使われる。
40          */
41         public void analizeRecord(String line, String split) {
42                 this.clear();
43                 if (split == null) {
44                         split = ",";
45                 }
46                 boolean append = false;
47                 boolean sss = false;            // ダブルクォーテーション内かどうか
48                 StringBuffer sbuf = null;
49                 for (StringTokenizer st = new StringTokenizer(line, split + "\"", true); st.hasMoreTokens(); ) {
50                         String token = st.nextToken();
51                         if (token.equals("\"")) {
52                                 if (sss) {
53                                         // ダブルクォーテーションEND
54                                         this.add(sbuf.toString());
55                                         append = true;
56                                         sss = false;
57                                 }
58                                 else {
59                                         // ダブルクォーテーションSTART
60                                         sbuf = new StringBuffer("");
61                                         sss = true;
62                                 }
63                         }
64                         else if (token.equals(split)) {
65                                 if (sss) {
66                                         sbuf.append(token);
67                                 }
68                                 else {
69                                         if (append == false) {
70                                                 this.add("");
71                                         }
72                                         append = false;
73                                 }
74                         }
75                         else {
76                                 if (sss) {
77                                         sbuf.append(token);
78                                 }
79                                 else {
80                                         this.add(token.trim());
81                                         append = true;
82                                 }
83                         }
84                 }
85                 if (append == false) {
86                         this.add("");
87                 }
88         }
89         
90         /**
91          * レコードの内容をCSV形式の文字列にして返す.
92          * 各項目はダブルクォーテーション(")で囲まれます。
93          * 各項目間は、カンマ(,)で区切られます。
94          * 
95          * @return このオブジェクトをCSVの1ライン形式として返します。
96          */
97         public String toString() {
98                 return this.toString(null);
99         }
100
101         /**
102          * レコードの内容をCSV形式の文字列にして返す.
103          * 各項目はダブルクォーテーション(")で囲まれます。
104          * 
105          * @param split 区切り記号。nullの時は「カンマ(,)」が使われる。
106          * @return このオブジェクトをCSVの1ライン形式として返します。
107          */
108         public String toString(String split) {
109                 StringBuffer ret = new StringBuffer();
110                 boolean top = true;
111                 for (String col : this) {
112                         if (top) {
113                                 top = false;
114                         }
115                         else {
116                                 ret.append(",");
117                         }
118                         ret.append("\""+ col +"\"");
119                 }
120                 return ret.toString();
121         }
122 }