1 package jp.co.areaweb.tools.csv;
\r
6 * <p>CSVファイルを操作する。<br>
\r
7 * このクラスではCSVに対するファイル操作と、各行を束ねた単位で操作します。各行は、CsvRecordオブジェクトで管理します。<br>
\r
8 * このクラスは通常,CsvRecordクラスとセットで利用します。</p>
\r
11 * <b>ファイルの読み出し例</b>:<br>
\r
12 * CsvFile csv = new CsvFile("C:\\Program Files\\data\\フォルダ\\ファイル.csv");<br>
\r
16 * <b>CSVレコードの追加と変更</b>:<br>
\r
17 if (csvf.isEmpty()) {<br>
\r
19 CsvRecord line = new CsvRecord();<br>
\r
20 line.add("code");<br>
\r
21 line.add("name");<br>
\r
26 CsvRecord line = csvf.getFirst();<br>
\r
27 line.set(1, "name");<br>
\r
31 * <b>ファイルに保存</b>(上書き):<br>
\r
36 * @version v2.17 2010/01/24
\r
37 * @see jp.co.areaweb.tools.csv.CsvRecord
\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
48 * pathnameで指定されたパス名のファイルを対象のCSVファイルとします.
\r
49 * @param pathname 対象のCSVファイルのパス名
\r
51 public CsvFile(String pathname) {
\r
52 this(new File(pathname));
\r
56 * fileで指定されたファイルを対象のCSVファイルとします.
\r
57 * @param file 対象のCSVファイル
\r
59 public CsvFile(File file) {
\r
64 * CVSファイルからデータを読みだします。
\r
65 * @throws Exception 例外
\r
67 public void load() throws Exception {
\r
72 * CVSファイルからデータを読みだします。
\r
74 * @param limit 読み出し数の制限
\r
75 * @throws Exception 例外
\r
77 public void load(int limit) throws Exception {
\r
79 LineNumberReader reader = new LineNumberReader(new InputStreamReader(new FileInputStream(this.file), this.charsetName));
\r
81 for (int i = 0; ((limit <= 0) || (i < limit)); i++) {
\r
82 if ((line = reader.readLine()) == null) {
\r
85 CsvRecord record = new CsvRecord();
\r
86 record.analizeRecord(line);
\r
93 * インポート元のキャラクタセットを設定する。
\r
94 * デフォルトは、「Windows31J」
\r
95 * @param charsetName 対象のCSVファイル内の文字コード
\r
97 public void setCharsetName(String charsetName) {
\r
98 this.charsetName = charsetName;
\r
102 * 現在設定されているCSVファイルの文字コードを取得する
\r
103 * @return 現在設定されている文字コードを取得する
\r
105 public String getCharsetName() {
\r
106 return this.charsetName;
\r
113 public File getFile() {
\r
121 public void setFile(File file) {
\r
126 * index番目の項目がdataStrになっているレコードを読み出す。
\r
127 * @param index 検索対象とする列番号(0~)
\r
128 * @param dataStr 検索値
\r
129 * @return 条件に合致したレコード(複数)
\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
144 * データ内容をファイルに書き戻す。<br>
\r
146 * @throws IOException ファイルへの書き出しに失敗した。
\r
148 public void save() throws IOException {
\r
153 * データ内容をファイルに書き戻す。<br>
\r
154 * @param outputFile 出力ファイル
\r
155 * @throws IOException ファイルへの書き出しに失敗した。
\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