2008年12月19日

正規表現でCSVパース


import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Sample2 {

public static void main(String[] args) throws Exception {

String str = "47201,\"90101\",\"9,010154\",\"オキナワケン\",\"ナハシ\",\"アカミネ\",\"沖縄県\",\"那\"\"覇市\",\"赤嶺\",0";

// 1. 基本的にコンマで区切った部分がスペースを含めて値である.
// 2. 値にコンマやダブルクウォートが含まれる場合は, 値全体をダブルクウォートで囲む.
// 3. 値に含まれるダブルクウォートは "" となる.
//※値の中に改行コードがあるデータは対象外です。

//処理を容易にするために末尾にカンマを付与します。
str = str.replaceAll("(?:\\x0D\\x0A|[\\x0D\\x0A])?$", ",");

Pattern pattern = Pattern.compile("(\"[^\"]*(?:\"\"[^\"]*)*\"|[^,]*),");
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {

//正規表現パターンにマッチしたグループ1(括弧に括られている所)を取得
String s = matcher.group(1);

//"値"→値にトリミング & 値中の""を"に変換してから格納
s = s.replaceAll("^\"(.*)\"$", "$1");
s = s.replaceAll("\"\"", "\"");
System.out.println(s);
}

}
}


47201
90101
9,010154
オキナワケン
ナハシ
アカミネ
沖縄県
那"覇市
赤嶺
0
posted by 台北猫々 at 21:58| Comment(0) | TrackBack(0) | 技術メモ(Java)
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/24543531

この記事へのトラックバック