public class CsvFile
- extends LinkedList<CsvRecord>
CSVファイルを操作する。
このクラスではCSVに対するファイル操作と、各行を束ねた単位で操作します。各行は、CsvRecordオブジェクトで管理します。
このクラスは通常,CsvRecordクラスとセットで利用します。
例: ファイルの読み出し
CsvFile csv = new CsvFile("C:\\Program Files\\data\\フォルダ\\ファイル.csv");
csv.load();
例: CSVレコードの追加と変更
if (csvf.isEmpty()) {
// 新規レコード
CsvRecord line = new CsvRecord();
line.add("code");
line.add("name");
csvf.add(line);
}
else {
// 既存タグ
CsvRecord line = csvf.getFirst();
line.set(1, "name");
}
例: ファイルに保存(上書き)
csv.save();
src/jp/co/areaweb/tools/csv/CsvFile.java
package jp.co.areaweb.tools.csv;
import java.io.*;
import java.util.*;
/**
* @author y_hayashi
* @version v2.17 2010/01/24
* @see jp.co.areaweb.tools.csv.CsvFile
* @since 2005/06/01
*/
@SuppressWarnings("serial")
public class CsvFile extends LinkedList
{
protected String charsetName = "Windows-31J";
protected File file;
protected LinkedList allRecords = new LinkedList(); // CSVファイル内の全データを保持するコレクション
/**
* pathnameで指定されたパス名のファイルを対象のCSVファイルとします.
* @param pathname 対象のCSVファイルのパス名
*/
public CsvFile(String pathname) {
this(new File(pathname));
}
/**
* fileで指定されたファイルを対象のCSVファイルとします.
* @param file 対象のCSVファイル
*/
public CsvFile(File file) {
this.file = file;
}
/**
* CVSファイルからデータを読みだします。
*/
public void load() throws Exception {
this.clear();
LineNumberReader reader = new LineNumberReader(new InputStreamReader(new FileInputStream(this.file), this.charsetName));
for (String line; (line = reader.readLine()) != null; ) {
CsvRecord record = new CsvRecord();
record.analizeRecord(line);
this.add(record);
}
}
/**
* インポート元のキャラクタセットを設定する。
* デフォルトは、「Windows31J」
* @param charsetName 対象のCSVファイル内の文字コード
*/
public void setCharsetName(String charsetName) {
this.charsetName = charsetName;
}
/**
* 現在設定されているCSVファイルの文字コードを取得する
* @return 現在設定されている文字コードを取得する
*/
public String getCharsetName() {
return this.charsetName;
}
/**
* インポート元ファイルを取得する。
* @return 実体ファイル
*/
public File getFile() {
return this.file;
}
/**
* index番目の項目がdataStrになっているレコードを読み出す。
* @param index 検索対象とする列番号(0~)
* @param dataStr 検索値
* @return 条件に合致したレコード(複数)
*/
public CsvFile find(int index, String dataStr) {
CsvFile result = new CsvFile(this.file);
for (Iterator i = this.iterator(); i.hasNext(); ) {
CsvRecord record = (CsvRecord)i.next();
String data = (String)record.get(index);
if (data.equals(dataStr)) {
result.add(record);
}
}
return result;
}
/**
* データ内容をファイルに書き戻す。
* 当然、上書き書き込みになります。
* @throws IOException ファイルへの書き出しに失敗した。
*/
public void save() throws IOException {
FileOutputStream fo = new FileOutputStream(getFile());
PrintStream ps = new PrintStream(fo);
for (Iterator i = this.iterator(); i.hasNext(); ) {
CsvRecord record = (CsvRecord)i.next();
ps.println(record.toString());
}
ps.close();
fo.close();
}
}
-
public class CsvRecord
- extends LinkedList<String>
CSVファイルの1行分のレコードを表す.
1行は、Stringオブジェクトのコレクションとして表現する.
このクラスは通常,CsvFileクラスとセットで利用します.
利用方法につては、CsvFileクラスのコメントを参照してください。
src/jp/co/areaweb/tools/csv/CsvRecord.java
package jp.co.areaweb.tools.csv;
import java.util.*;
/**
* CSVファイルの1行分のレコードを表す.
* 1行は、Stringオブジェクトのコレクションとして表現する.
* このクラスは通常,CsvFileクラスとセットで利用します.
* 利用方法につては、CsvFileクラスのコメントを参照してください。
*
* @author y_hayashi
* @version v2.17 2010/01/24
* @see jp.co.areaweb.tools.csv.CsvFile
* @since 2005/06/01
*/
@SuppressWarnings("serial")
public class CsvRecord extends LinkedList
{
/**
* lineで示された文字列を、CSVレコードとして構文解析を行い、自身に取り込む.
* 取り込まれたセル文字列は、自信(LinkedList)のアイテムとして格納されます.
* 格納順序は、左から順に格納される.
* v2.17-2010/01/24より、ダブルクォーテーションで囲まれたセルを処理できるように変更しました。
* 自信のアイテムとして格納するときに、前後のダブルクォーテーションは削除されます。
*
* @param line CSVレコード解析を行う文字列行(つまり、CSVの1ライン)
*/
public void analizeRecord(String line) {
this.clear();
boolean append = false;
boolean sss = false; // ダブルクォーテーション内かどうか
StringBuffer sbuf = null;
for (StringTokenizer st = new StringTokenizer(line, ",\"", true); st.hasMoreTokens(); ) {
String token = st.nextToken();
if (token.equals("\"")) {
if (sss) {
// ダブルクォーテーションEND
this.add(sbuf.toString());
append = true;
sss = false;
}
else {
// ダブルクォーテーションSTART
sbuf = new StringBuffer("");
sss = true;
}
}
else if (token.equals(",")) {
if (sss) {
sbuf.append(token);
}
else {
if (append == false) {
this.add("");
}
append = false;
}
}
else {
if (sss) {
sbuf.append(token);
}
else {
this.add(token.trim());
append = true;
}
}
}
if (append == false) {
this.add("");
}
}
/**
* レコードの内容をCSV形式の文字列にして返す.
* 各項目はダブルクォーテーション(")で囲まれます。
* 各項目間は、カンマ(,)で区切られます。
* @return このオブジェクトをCSVの1ライン形式として返します。
*/
public String toString() {
StringBuffer ret = new StringBuffer();
boolean top = true;
for (String col : this) {
if (top) {
top = false;
}
else {
ret.append(",");
}
ret.append("\""+ col +"\"");
}
return ret.toString();
}
}