- ベストアンサー
文字列からダブルクオートの削除
お世話になります、 CSVからデータを取得してDBに書き込む処理を行っているのですが、CSVデータで型が文字のものはダブルクオート(")でくくっています。 (例) "りんご",100,"円" "ばなな",200,"ドル" このままデータをStringTokenizerクラスを使用して取得した場合りんごは("りんご")のようにダブルクオートがついた状態で取得されてしまいます。 ダブルクオートを取り外す方法またはメソッドを教えていただきたいのですが、よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
以前作成した1行文字列をフィールド分割する関数ソースを載せておくので 参考にしてください。 もっといい方法があるのかもしれませんが、とりあえずここでは 一文字ずつ呼んでダブルクオートを削除し、又ダブルクオート内の カンマはそのまま文字として使用するようにしてます。 面倒だったので文字内にダブルクオートを使用することは考慮に入れてません(^^; ArrayList parsLine(String line){ ArrayList fields = new ArrayList(); if(line == null) return; boolean isQuort = false; //ダブルコーテーション内フラグ StringBuffer field = null; for(int i=0;i<line.length();i++){ char code = line.charAt(i); if(isQuort){ //ダブルクオート内 if(code == '\"'){ isQuort = false; } else{ if(field == null) field = new StringBuffer(); field.append(code); } } else{ //ダブルクオート外 if(code == '\"'){ isQuort = true; } else if(code == ','){ if(field == null) field = new StringBuffer(); fields.add(field.toString()); field = null; } else{ if(field == null) field = new StringBuffer(); field.append(code); } } } if(field != null){ fields.add(field.toString()); } return fields; }
その他の回答 (3)
- aton
- ベストアンサー率47% (160/334)
基本的には#3のkana-tanさんの方法でうまくいくと思うのですが,".." の中に ',' を含むような複雑な文字列を処理したい場合は,java.io.StreamTokenizer クラスを利用すると良いと思います。 このクラスには,quoteChar(int ch) というメソッドがあって,ch で指定した文字を引用符として解釈してくれます。この指定をしたあと,java.io.StreamTokenizer#nextToken() を使って次のトークンを読み込むと,<ch で指定した文字>の直後から,次に<ch で指定した文字>が現れる直前までを一つの文字列として読み込むことができます。
StringTokenizerクラスのコンストラクタの引数には、区切り文字を指定できます。 次のような、感じです。 (ソース中に"(ダブルクォート)を書いたので見にくくなってすみません) String str = "\"This\",\"is\",\"a\",\"test\""; StringTokenizer st = new StringTokenizer(str,"\","); while(st.hasMoreTokens()){ System.out.println(st.nextToken()); } 結果は This is a test と表示されます。 (APIドキュメントのStringTokenizerクラスの説明に記載されているソースを一部改変しました)
- yuji
- ベストアンサー率37% (64/169)
一般的かどうかはわかりませんが、 私の場合は jakartaのOROライブラリ(正規表現ライブラリ) を使って置換しています。 Perlと同じようにsコマンドで置換できます。 outStr = perl.substitute("s/\"//g", inStr); みたいな感じ。 正規表現ライブラリの使い方については JavaWorld 2001/4月号にも載っています。