2010年2月16日火曜日

ブログからWebサイトへ移行

プログラムサンプルのネタとして、一応の完成を見せたネタはブルグよりもより整理された形で永続化を図る方が閲覧される利用者にとってもより良いのではないかと考え、Webサイトへの移行作業を進めていきます。
順次移行を進めます。移行対象のネタは永続化の公開に耐えれるレベルのものを移行します。レベルの低いネタはこのままここに残すつもりです。また、移行されたネタもここに残します。

2010年2月14日日曜日

シャッフル機能がない単純なMP3プレイヤー用の曲順変更ツール

「MusicShuffle」は、シャッフル機能がない単純なMP3プレイヤー('music chample'など)用の曲順変更ツールです。

 このスレッドは移動しました。
http://sites.google.com/site/hayashiyuu/home/--musicshuffle---saisei-kyoku-jun-henkou-tsuru

2010年2月3日水曜日

CSVファイルを読み出す&書き出す


パッケージ
jp.co.areaweb.tools.csv CSVファイルを扱うためのツールクラス群
・CSVの読取
・CSVの変更(削除・追加・値変更)
・CSVの書き出し(上書き保存・新規書き出し)





クラスの概要
CsvFile CSVファイルを操作する。
CsvRecordCSVファイルの1行分のレコードを表す.



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();
}
}