- PR -

String#split() を使ってCSV処理

1
投稿者投稿内容
Shane
大ベテラン
会議室デビュー日: 2003/06/06
投稿数: 132
お住まい・勤務地: Vancouver, BC
投稿日時: 2003-06-11 11:48
JDK1.4 から追加された String クラスの split() メソッドを使って、
CSV ファイルの処理をしようとしているのですが、正規表現が不得意のためうまくいきません。
(web で Perl などの CSV 用の正規表現が見つかりますがそのままでは動かず、どう直せばいいかも素人過ぎてわかりません)

期待する動作は以下です。
元データ: field1,"field,2","field""3""",,field5
String[]: [field1][field,2][field"3"][][field5]
呂布
会議室デビュー日: 2003/03/07
投稿数: 16
お住まい・勤務地: Tokyo
投稿日時: 2003-06-11 14:33
カンマじゃなくってメタキャラ(例えば\tとか)だったら、一発だったのにね…。
正規表現(Perl)結構詳しい方だと思うのですが、そのパターンはお手上げです。
頑張ってください(現時点で200人の人が素通りしていることを考えると、やっぱ並じゃないのかも)。
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2003-06-11 15:03
練習にエディタの正規表現で当ててみました
〜,"","",
の0文字項目が無いと仮定してでは。
””を考えずに ([^",]*),
次に、”〜”を追加して ("[^"]+"|[^",]*),
次に、””内の””を追加して ("([^"]+|"")+"|[^",]*),
これで、例題のテキストは順に当たるようになりました。

1、行末にカンマを付加
2、上の正規表現で切り出し
3、項目内の””を1つに

頭から1文字づつ解析するのが漢(おとこ)かも。
---------------------------------------------
(?="(""|[^"])+"|[^,]*),
あたりでしょうか?エディタの正規表現で確認しましょう。

[ メッセージ編集済み 編集者: MMX 編集日時 2003-06-11 16:53 ]
Shane
大ベテラン
会議室デビュー日: 2003/06/06
投稿数: 132
お住まい・勤務地: Vancouver, BC
投稿日時: 2003-06-12 18:20
> (?="(""|[^"])+"|[^,]*),
> あたりでしょうか?エディタの正規表現で確認しましょう。

正規表現に疎くて恐縮ですが、
String::split の正規表現はご使用のエディタと同じ処理系?なのでしょうか?
残念ながら期待するようにうごきませんでした。

> 頭から1文字づつ解析するのが漢(おとこ)かも。

やっぱそうですかねぇ。
そういうクラスはどこかに落ちてそうですが、
標準の String クラスのメソッドで出来たらスマートだなぁと思った次第です。
yamamoto
会議室デビュー日: 2003/05/16
投稿数: 14
お住まい・勤務地: 福岡
投稿日時: 2003-06-12 20:17
String クラスの split() メソッドを使うのではなく、
「java.util.regex」パッケージのクラスを利用してみてはいかがでしょうか?

http://www.din.or.jp/~ohzaki/perl.htm#CSV2Values
のような正規表現でCSVのデータ部分にマッチしますので、
それを String[] に格納していけばいいと思いますが。

[ メッセージ編集済み 編集者: yamamoto 編集日時 2003-06-12 21:39 ]
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2003-06-13 19:28
"aaa,bbb,ccc".split('(?="(""|[^"])+"|[^,]*),' );
/*
* Created on 2003/06/13
*
* To change the template for this generated file go to
* Window>Preferences>Java>Code Generation>Code and Comments
*/

/**
* @author サミュエル・L・ジャクソン
*
* To change the template for this generated type comment go to
* Window>Preferences>Java>Code Generation>Code and Comments
*/
public class testsplit {
public static void main(String[] args) {
System.out.println("aaa,\"b\"\"bb\",ccc".split("(?=\"(\"\"|[^\"])+\"|[^,]*),")[1].replaceAll("\"\"","\""));
// '(?="(""|[^"])+"|[^,]*),' );
//
}
}
// Perl5 互換の正規表現の流通性はよいです。
// さて、大量データに対応した書き方はどう?そこまで心配しなくてよいか
1

スキルアップ/キャリアアップ(JOB@IT)