OSDN Git Service

2019-02-11
[hayashilib/hayashi.git] / src / jp / co / areaweb / tools / csv / CsvReader.java
1 package jp.co.areaweb.tools.csv;\r
2 import java.io.*;\r
3 import java.util.LinkedList;\r
4 \r
5 import jp.co.areaweb.tools.csv.CsvRecord;\r
6 \r
7 /**\r
8  * <p>CSVファイルの読み取りを行う。<br>\r
9  * このクラスではCSVに対するファイル操作と、各行を束ねた単位で操作します。各行は、CsvRecordオブジェクトで管理します。<br>\r
10  * このクラスは通常,CsvRecordクラスとセットで利用します。</p>\r
11  * \r
12  * (読み出し可能ファイルサイズ=最大8MBまで)\r
13  * \r
14  * @author y_hayashi\r
15  * @version v2.23       2010/07/27\r
16  * @see jp.co.areaweb.tools.csv.CsvRecord\r
17  * @since 2010/07/27\r
18  */\r
19 public class CsvReader\r
20 {\r
21         /**\r
22          * CSVファイルの読み取りを行う。\r
23          * (読み出し可能ファイルサイズ=最大8MBまで)\r
24          * \r
25          * @param args  パラメータ\r
26          * @throws      Exception       error\r
27          */\r
28         public static void main(String[] args) throws Exception {\r
29                 File file = new File("test.csv");\r
30                 CsvReader obj = new CsvReader(file, true, ",");\r
31                 int size = obj.load();\r
32                 System.out.println("line count = "+ obj.size());\r
33                 \r
34                 for (int i=0; i < size; i++) {\r
35                         System.out.print(String.format("%05d : ", i));\r
36                         CsvRecord rec = obj.get(i);\r
37                         if (rec != null) {\r
38                                 System.out.println(rec.toString());\r
39                         }\r
40                         else {\r
41                                 System.out.println("< null >");\r
42                         }\r
43                 }\r
44         }\r
45 \r
46         \r
47         int size = 0;\r
48         int columnSize = 0;\r
49         boolean titleLine = false;\r
50         File file = null;\r
51         String split = ",";\r
52         protected String charsetName = "Windows-31J";\r
53         LineNumberReader reader;\r
54         \r
55         /**\r
56          * <コンストラクタ>\r
57          * fileで指定されたファイルを対象のCSVファイルとします.\r
58          * \r
59          * @param file 対象のCSVファイル\r
60          * @throws IOException          例外\r
61          * @throws UnsupportedEncodingException 例外\r
62          */\r
63         public CsvReader(File file) throws UnsupportedEncodingException, IOException {\r
64                 this(file, false, ",");\r
65         }\r
66         \r
67         /**\r
68          * <コンストラクタ>\r
69          * fileで指定されたファイルを対象のCSVファイルとします.\r
70          * \r
71          * @param file 対象のCSVファイル\r
72          * @param titleLine             boolean\r
73          * @param split                 string\r
74          * @throws IOException          例外\r
75          * @throws UnsupportedEncodingException 例外\r
76          */\r
77         public CsvReader(File file, boolean titleLine, String split) throws UnsupportedEncodingException, IOException {\r
78                 this.file = file;\r
79                 this.titleLine = titleLine;\r
80                 this.reader = null;\r
81                 this.split = split;\r
82         }\r
83         \r
84         /**\r
85          * CVSファイルからデータを読みだします。\r
86          * (読み出し可能ファイルサイズ=最大8MBまで)\r
87          * @throws Exception            例外\r
88          * @return      読み出しサイズ\r
89          */\r
90         public int load() throws Exception {\r
91                 this.reader = new LineNumberReader(new InputStreamReader(new FileInputStream(this.file), this.charsetName));\r
92                 this.reader.mark(1024 * 1024 * 8);\r
93                 this.size = 0;\r
94                 this.columnSize = 0;\r
95                 while (reader.readLine() != null) {\r
96                         this.size++;\r
97                 }\r
98                 return size;\r
99         }\r
100         \r
101         \r
102         public CsvRecord get(int index) {\r
103                 if ((index < 0) || (index > this.size)) {\r
104                         return null;\r
105                 }\r
106                 try {\r
107                         this.reader.reset();\r
108                         \r
109                         for (int i=0; i < index; i++) {\r
110                                 reader.readLine();\r
111                         }\r
112 \r
113                         String line = reader.readLine();\r
114                         if (line != null) {\r
115                                 CsvRecord record = new CsvRecord();\r
116                                 record.analizeRecord(line, this.split);\r
117                                 return record;\r
118                         }\r
119                 }\r
120                 catch (IOException e) {\r
121                         e.printStackTrace();\r
122                 }\r
123                 return null;\r
124         }\r
125 \r
126         /**\r
127          * index番目の項目がdataStrになっているレコードを読み出す。\r
128          * @param index 検索対象とする列番号(0~)\r
129          * @param dataStr 検索値\r
130          * @return 条件に合致したレコード(複数)\r
131          * @throws IOException          例外\r
132          */\r
133         public LinkedList<CsvRecord> find(int index, String dataStr) throws IOException {\r
134                 if ((index < 0) || (index > this.size)) {\r
135                         return null;\r
136                 }\r
137                 LinkedList<CsvRecord> result = new LinkedList<CsvRecord>();\r
138                 this.reader.reset();\r
139                 \r
140                 for (int i=0; i < this.size; i++) {\r
141                         String line = reader.readLine();\r
142                         if (line != null) {\r
143                                 CsvRecord record = new CsvRecord();\r
144                                 record.analizeRecord(line, this.split);\r
145                                 String item = record.get(index);\r
146                                 if ((item != null) && item.trim().equals(dataStr)) {\r
147                                         result.add(record);\r
148                                 }\r
149                         }\r
150                 }\r
151                 return result;\r
152         }\r
153 \r
154         public int size() {\r
155                 return this.size;\r
156         }\r
157 \r
158         /**\r
159          * インポート元のキャラクタセットを設定する。\r
160          * デフォルトは、「Windows31J」\r
161          * @param charsetName 対象のCSVファイル内の文字コード\r
162          */\r
163         public void setCharsetName(String charsetName) {\r
164                 this.charsetName = charsetName;\r
165         }\r
166         \r
167         /**\r
168          * 現在設定されているCSVファイルの文字コードを取得する\r
169          * @return 現在設定されている文字コードを取得する\r
170          */\r
171         public String getCharsetName() {\r
172                 return this.charsetName;\r
173         }\r
174 }\r