- ベストアンサー
文字列の置換について。
ダブルコーテーションで囲まれ文字列が あったとします。 その文字列の中に含まれる半角カンマを なくしたいのですが、 リプレイスだと反応がありません。 その他の文字は置換出来るのですが。 どなたから、ダブルコーテーションに囲まれた 文字列の中の半角カンマを取り除く方法が ありましたらアドバイス下さい。 どうぞよろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
ああ、そういうことでしたか。 それなら、単純なreplaceでは対応できません。 御自身でお書きの通り、splitは単純に分割するもので、ダブルクォートの外とか中とかを考慮しません。 replaceも同様に、外と中を考慮しません。 先にreplaceすれば、splitで分割できなくなるし、先にsplitを先にすれば、ダブルクォートの中のカンマでも分割され、そのあとreplaceしようにもカンマ自体がありません。 ダブルクォートで囲まれた範囲を別に処理する必要があります。 「java csv パーサ」で検索してみてください。
その他の回答 (3)
- teketon
- ベストアンサー率65% (141/215)
単独で機能しているのならば、どこかで処理が間違っている可能性が大です。 EclipseやNetBeansのようなIDEのデバッグモードを使用したり、 Sysytem.out.println()を埋め込むなりして、想定結果と異なる箇所を特定しましょう。 稀に機能しないなど、偶発的なものなら間違っている箇所を特定することは困難ですが、 ほぼ機能していないならば、最初から最後までの処理を読めばいいだけなので、特定は容易な方です。
補足
アドバイスどうもありがとうございます。 エラーが出るのは、生データをいじって中身がおかしくなっていたようです。 改めて試したのですが 出力は出来ますが、 while((line = in.readLine()) != null) { 配列line = line.split(","); で、半角カンマ区切りで読み込んでますので 配列ごとに先に分割されてしまうようですので リプレイス等で、半角カンマを置換できずに 配列ごとに分割されてしまうようです。 Sysytem.out.println()の実行結果ですと 例 実行前 "あいう,えお" ,かきくけこ 実行後 "あいう えお" かきくけこ のようになってしまいます。
- kmee
- ベストアンサー率55% (1857/3366)
import java.util.regex.*; class b { public static void main(String argv[]) { String c="ab,abc,de"; // 補足にあったコード String text = new String(c); Pattern pattern = Pattern.compile(","); Matcher matcher = pattern.matcher(text); StringBuffer appStrBuf = new StringBuffer(); while (matcher.find()) { matcher.appendReplacement(appStrBuf, " "); } matcher.appendTail(appStrBuf); // 単純なreplace String c0=c.replace(","," "); String c1=c.replaceAll(","," "); System.out.println(c); System.out.println(appStrBuf); System.out.println(c0); System.out.println(c1); } } → ab,abc,de // もとのcは変化しない ab abc de // appStrBuf ab abc de // String.replace ab abc de // String.replaceAll となりますけど。
補足
アドバイスどうもありがとうございます。 単体の実行結果で検証すると半角カンマは置換できます。 半角カンマのままですと、反応しないというより エラーでテキスト入出力出来ません。 テキスト全体のフィールドごとの区切りを private static String Sign() { String Verticalbar = "|"; return commaorVerticalbar;} バーティカルバー区切りにしてもダメです。 全体のプログラムに問題があるのでしょうか。 現状は半角カンマを全角カンマに修正してから テキスト入出力しています。 もう少し色々試してみます。
- kmee
- ベストアンサー率55% (1857/3366)
具体的にどうやったのですか? http://docs.oracle.com/javase/jp/6/api/java/lang/String.html#replace%28char,%20char%29 http://docs.oracle.com/javase/jp/6/api/java/lang/String.html#replace(java.lang.CharSequence,%20java.lang.CharSequence) http://docs.oracle.com/javase/jp/6/api/java/lang/String.html#replaceAll(java.lang.String,%20java.lang.String) どれでもできそうですけど
補足
String text = new String(c); Pattern pattern = Pattern.compile(","); Matcher matcher = pattern.matcher(text); StringBuffer appStrBuf = new StringBuffer(); while (matcher.find()) { matcher.appendReplacement(appStrBuf, " "); } matcher.appendTail(appStrBuf); Systemout.print(appStrBuf); } のようにして半角カンマをスペースにしたりとか 単純に c.replaceAll(","," ");のようにして反応がありません。 その他の文字は置換できます。
お礼
java csv パーサで調べてやってみます。 本来配列以外で、カンマが入る場合は 配列の区切り自体|(バーティカルバー)区切りにしてもらうと こうした問題がおきなくて管理しやすいのですが… どうもありがとうございました。