OSDN Git Service

2019-02-11
[hayashilib/hayashi.git] / src / jp / co / areaweb / tools / csv / CsvFile.java
1 package jp.co.areaweb.tools.csv;\r
2 import java.io.*;\r
3 import java.util.*;\r
4 \r
5 /**\r
6  * <p>CSVファイルを操作する。<br>\r
7  * このクラスではCSVに対するファイル操作と、各行を束ねた単位で操作します。各行は、CsvRecordオブジェクトで管理します。<br>\r
8  * このクラスは通常,CsvRecordクラスとセットで利用します。</p>\r
9  * \r
10  * <p>\r
11  *      <b>ファイルの読み出し例</b>:<br>\r
12  *        CsvFile csv = new CsvFile("C:\\Program Files\\data\\フォルダ\\ファイル.csv");<br>\r
13  *        csv.load();\r
14  * </p>\r
15  * <p>\r
16  *      <b>CSVレコードの追加と変更</b>:<br>\r
17           if (csvf.isEmpty()) {<br>\r
18             // 新規レコード<br>\r
19             CsvRecord line = new CsvRecord();<br>\r
20             line.add("code");<br>\r
21             line.add("name");<br>\r
22             csvf.add(line);<br>\r
23           }<br>\r
24           else {<br>\r
25             // 既存タグ<br>\r
26             CsvRecord line = csvf.getFirst();<br>\r
27             line.set(1, "name");<br>\r
28           }<br>\r
29  * </p>\r
30  * <p>\r
31  *      <b>ファイルに保存</b>(上書き):<br>\r
32  *        csv.save();\r
33  * </p>\r
34  * \r
35  * @author y_hayashi\r
36  * @version v2.17       2010/01/24\r
37  * @see jp.co.areaweb.tools.csv.CsvRecord\r
38  * @since 2005/06/01\r
39  */\r
40 @SuppressWarnings("serial")\r
41 public class CsvFile extends LinkedList<CsvRecord> {\r
42         //String pathname;              // 対象CSVファイルのパス名\r
43         protected String charsetName = "Windows-31J";\r
44         protected File file;\r
45         protected LinkedList<CsvRecord> allRecords = new LinkedList<CsvRecord>();       // CSVファイル内の全データを保持するコレクション\r
46         \r
47         /**\r
48          * pathnameで指定されたパス名のファイルを対象のCSVファイルとします.\r
49          * @param pathname 対象のCSVファイルのパス名\r
50          */\r
51         public CsvFile(String pathname) {\r
52                 this(new File(pathname));\r
53         }\r
54 \r
55         /**\r
56          * fileで指定されたファイルを対象のCSVファイルとします.\r
57          * @param file 対象のCSVファイル\r
58          */\r
59         public CsvFile(File file) {\r
60                 this.file = file;\r
61         }\r
62         \r
63         /**\r
64          * CVSファイルからデータを読みだします。\r
65          * @throws      Exception       例外\r
66          */\r
67         public void load() throws Exception {\r
68                 this.load(0);\r
69         }\r
70         \r
71         /**\r
72          * CVSファイルからデータを読みだします。\r
73          * (読み出し数の制限付き)\r
74          * @param limit                 読み出し数の制限\r
75          * @throws      Exception       例外\r
76          */\r
77         public void load(int limit) throws Exception {\r
78                 this.clear();\r
79                 LineNumberReader reader = new LineNumberReader(new InputStreamReader(new FileInputStream(this.file), this.charsetName));\r
80                 String line;\r
81                 for (int i = 0; ((limit <= 0) || (i < limit)); i++) {\r
82                         if ((line = reader.readLine()) == null) {\r
83                                 break;\r
84                         }\r
85                         CsvRecord record = new CsvRecord();\r
86                         record.analizeRecord(line);\r
87                         this.add(record);\r
88                 }\r
89                 reader.close();\r
90         }\r
91         \r
92         /**\r
93          * インポート元のキャラクタセットを設定する。\r
94          * デフォルトは、「Windows31J」\r
95          * @param charsetName 対象のCSVファイル内の文字コード\r
96          */\r
97         public void setCharsetName(String charsetName) {\r
98                 this.charsetName = charsetName;\r
99         }\r
100         \r
101         /**\r
102          * 現在設定されているCSVファイルの文字コードを取得する\r
103          * @return 現在設定されている文字コードを取得する\r
104          */\r
105         public String getCharsetName() {\r
106                 return this.charsetName;\r
107         }\r
108         \r
109         /**\r
110          * インポート元ファイルを取得する。\r
111          * @return 実体ファイル\r
112          */\r
113         public File getFile() {\r
114                 return this.file;\r
115         }\r
116 \r
117         /**\r
118          * 元ファイルを設定する。\r
119          * @param       file    File\r
120          */\r
121         public void setFile(File file) {\r
122                 this.file = file;\r
123         }\r
124 \r
125         /**\r
126          * index番目の項目がdataStrになっているレコードを読み出す。\r
127          * @param index 検索対象とする列番号(0~)\r
128          * @param dataStr 検索値\r
129          * @return 条件に合致したレコード(複数)\r
130          */\r
131         public CsvFile find(int index, String dataStr) {\r
132                 CsvFile result = new CsvFile(this.file);\r
133                 for (Iterator<CsvRecord> i = this.iterator(); i.hasNext(); ) {\r
134                         CsvRecord record = (CsvRecord)i.next();\r
135                         String data = (String)record.get(index);\r
136                         if (data.equals(dataStr)) {\r
137                                 result.add(record);\r
138                         }\r
139                 }\r
140                 return result;\r
141         }\r
142 \r
143         /**\r
144          * データ内容をファイルに書き戻す。<br>\r
145          * 当然、上書き書き込みになります。\r
146          * @throws IOException ファイルへの書き出しに失敗した。\r
147          */\r
148         public void save() throws IOException {\r
149                 save(getFile());\r
150         }\r
151 \r
152         /**\r
153          * データ内容をファイルに書き戻す。<br>\r
154          * @param outputFile    出力ファイル\r
155          * @throws IOException ファイルへの書き出しに失敗した。\r
156          */\r
157         public void save(File outputFile) throws IOException {\r
158                 FileOutputStream fo = new FileOutputStream(outputFile);\r
159                 PrintStream ps = new PrintStream(fo);\r
160                 for (Iterator<CsvRecord> i = this.iterator(); i.hasNext(); ) {\r
161                         CsvRecord record = (CsvRecord)i.next();\r
162                         ps.println(record.toString());\r
163                 }\r
164                 ps.close();\r
165                 fo.close();\r
166         }\r
167 }\r