OSDN Git Service

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