“2011/07/01,歯ブラシ,120円”
のようなcsvデータがあったとする。データは
年、月、日、品目、値段
の順に並んでいるものとする。
この内容を、
static class Data
{
public final int Year;
public final int Month;
public final int Day;
public final String Article;
public final int Price;
public Data(
int year,
int month,
int day,
String article,
int price )
{
this.Year = year;
this.Month = month;
this.Day = day;
this.Article = article;
this.Price = price;
}
}
のようなクラスのオブジェクトに変換したい。
このとき、正規表現を使うと効率的に情報を取得できる。
例えば、上の例のcsvの正規表現を
“([1-9][0-9]{3})/([0-2][1-9])/([0-3][0-9]),(.*),([1-9][0-9]*)円”
のように書いてみた。このように各部分をグループ化しておくことで、前方から
年、月、日、品目、値段
の順番で情報を取得できる。その様子をコードにすると、以下のような感じになるだろう。
public static Data parse(String string){
Data result = null;
Matcher matcher =
pattern.matcher("([1-9][0-9]{3})/([0-2][1-9])/([0-3][0-9]),(.*),([1-9][0-9]*)円");
if( matcher.find()){
result = new Data(
Integer.parseInt(matcher.group(1)),
Integer.parseInt(matcher.group(2)),
Integer.parseInt(matcher.group(3)),
matcher.group(4),
Integer.parseInt(matcher.group(5)));
}
return result;
}
最後に、サンプルプログラムの全体を示す。
public class Main {
/**
* 元csvデータ
*/
static final String[] csvData = new String[]{
"2011/07/01,歯ブラシ,120円",
"2011/07/01,タオル,250円",
"2011/07/01,スリッパ,800円",
"2011/07/01,リンゴ,500円"
};
/**
* データを表現したクラス
*/
static class Data
{
public final int Year;
public final int Month;
public final int Day;
public final String Article;
public final int Price;
public Data(int year, int month, int day, String article, int price){
this.Year = year;
this.Month = month;
this.Day = day;
this.Article = article;
this.Price = price;
}
@Override
public String toString() {
return Year + "年" + Month + "月" + Day + "日" + " " + Article + " " + Price + "円";
}
private static final String REGEX =
"([1-9][0-9]{3})/([0-2][1-9])/([0-3][0-9]),(.*),([1-9][0-9]*)円";
private static final Pattern pattern = Pattern.compile(REGEX);
/**
* 文字列からパースしてオブジェクトを作る
* @param string
* @return
*/
public static Data parse(String string){
Data result = null;
Matcher matcher = pattern.matcher(string);
if( matcher.find()){
result = new Data(
Integer.parseInt(matcher.group(1)),
Integer.parseInt(matcher.group(2)),
Integer.parseInt(matcher.group(3)),
matcher.group(4),
Integer.parseInt(matcher.group(5)));
}
return result;
}
}
/**
* @param args
*/
public static void main(String[] args) {
List<Data> dataList = new ArrayList<Data>();
for( int i=0; i<csvData.length; i++ ){
// csvの元データをDataオブジェクトに変換する
Data data = Data.parse(csvData[i]);
if( data != null){
dataList.add(data);
}
}
// 変換結果を表示
for(Data d:dataList){
System.out.println(d);
}
}
}
実行すると、以下のような結果となる。
2011年7月1日 歯ブラシ 120円
2011年7月1日 タオル 250円
2011年7月1日 スリッパ 800円
2011年7月1日 リンゴ 500円
このようにして、簡単にcsvから変換することができた。