OSDN Git Service

Merge branch 'master' of ssh://www.deister.jp/mnt/hdb1/git/hayashi
[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          */\r
66         public void load() throws Exception {\r
67                 this.load(0);\r
68         }\r
69         \r
70         /**\r
71          * CVSファイルからデータを読みだします。\r
72          * (読み出し数の制限付き)\r
73          */\r
74         public void load(int limit) throws Exception {\r
75                 this.clear();\r
76                 LineNumberReader reader = new LineNumberReader(new InputStreamReader(new FileInputStream(this.file), this.charsetName));\r
77                 String line;\r
78                 for (int i = 0; ((limit <= 0) || (i < limit)); i++) {\r
79                         if ((line = reader.readLine()) == null) {\r
80                                 break;\r
81                         }\r
82                         CsvRecord record = new CsvRecord();\r
83                         record.analizeRecord(line);\r
84                         this.add(record);\r
85                 }\r
86                 reader.close();\r
87         }\r
88         \r
89         /**\r
90          * インポート元のキャラクタセットを設定する。\r
91          * デフォルトは、「Windows31J」\r
92          * @param charsetName 対象のCSVファイル内の文字コード\r
93          */\r
94         public void setCharsetName(String charsetName) {\r
95                 this.charsetName = charsetName;\r
96         }\r
97         \r
98         /**\r
99          * 現在設定されているCSVファイルの文字コードを取得する\r
100          * @return 現在設定されている文字コードを取得する\r
101          */\r
102         public String getCharsetName() {\r
103                 return this.charsetName;\r
104         }\r
105         \r
106         /**\r
107          * インポート元ファイルを取得する。\r
108          * @return 実体ファイル\r
109          */\r
110         public File getFile() {\r
111                 return this.file;\r
112         }\r
113 \r
114         /**\r
115          * 元ファイルを設定する。\r
116          * @return 実体ファイル\r
117          */\r
118         public void setFile(File file) {\r
119                 this.file = file;\r
120         }\r
121 \r
122         /**\r
123          * index番目の項目がdataStrになっているレコードを読み出す。\r
124          * @param index 検索対象とする列番号(0~)\r
125          * @param dataStr 検索値\r
126          * @return 条件に合致したレコード(複数)\r
127          */\r
128         public CsvFile find(int index, String dataStr) {\r
129                 CsvFile result = new CsvFile(this.file);\r
130                 for (Iterator<CsvRecord> i = this.iterator(); i.hasNext(); ) {\r
131                         CsvRecord record = (CsvRecord)i.next();\r
132                         String data = (String)record.get(index);\r
133                         if (data.equals(dataStr)) {\r
134                                 result.add(record);\r
135                         }\r
136                 }\r
137                 return result;\r
138         }\r
139 \r
140         /**\r
141          * データ内容をファイルに書き戻す。<br>\r
142          * 当然、上書き書き込みになります。\r
143          * @throws IOException ファイルへの書き出しに失敗した。\r
144          */\r
145         public void save() throws IOException {\r
146                 save(getFile());\r
147         }\r
148 \r
149         /**\r
150          * データ内容をファイルに書き戻す。<br>\r
151          * @throws IOException ファイルへの書き出しに失敗した。\r
152          */\r
153         public void save(File outputFile) throws IOException {\r
154                 FileOutputStream fo = new FileOutputStream(outputFile);\r
155                 PrintStream ps = new PrintStream(fo);\r
156                 for (Iterator<CsvRecord> i = this.iterator(); i.hasNext(); ) {\r
157                         CsvRecord record = (CsvRecord)i.next();\r
158                         ps.println(record.toString());\r
159                 }\r
160                 ps.close();\r
161                 fo.close();\r
162         }\r
163 }\r