BufferedReaderを使用してファイルを読み込む際に文字列を比較すると文字コードが変わる

このQ&Aのポイント
  • BufferedReaderを使用してファイルを読み込む際に、カンマで分割した文字列を比較すると文字コードが変わってしまう現象が発生します。
  • この現象は、文字列の比較時にバイト列に変換され、文字コードが異なる場合には異なる結果が得られるためです。
  • 解決するためには、文字列の比較前に文字コードの正規化を行う必要があります。文字コードを統一するためには、文字列を正規化するメソッドを使用するなどの対策があります。
回答を見る
  • ベストアンサー

文字列の比較について

BufferedReaderでファイルを読んだのちに、見出しの文字列をカンマで分割して 文字列を比較しようとしています。 ですが、分割すると、文字列が別な文字コードによる表記に変わってしまいます。 なぜでしょうか? また、解決方法などのヒントなどあれば教えてください。 BufferedReader buffReader = new BufferedReader( new FileReader("/home/masa/Desktop/Sample.csv")); String s; int ini=0; int wamei=0; int i=0; while((s = buffReader.readLine())!= null){ String[] str = s.split(",", -1); //System.out.println(s); if (i == 0) { for(int j=0; j<str.length;j++){ System.out.println(String.toString(str)); if(str.equals("五十音")){ini = j;} System.out.println("五十音"+ini); if(str.equals("a")){wamei = j;} System.out.println("和名"+wamei); //System.out.println(j); } } i++;

  • Java
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • zz4576
  • ベストアンサー率100% (1/1)
回答No.1

System.out.println(String.toString(str)); ↓ System.out.println(str[j]); にしたら表示できるんじゃないでしょうか? 質問のままだと、配列の番地を文字列にして出力しようとしてるんだと思います。

MASA0901
質問者

お礼

返信ありがとうございます。 返事が遅くなってすみません。 >System.out.println(String.toString(str)); この部分はよく理解せずにメソッドを使っていました。

その他の回答 (1)

  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.2

FileReaderクラスを使う場合はデフォルトの文字コードで読み込まれますが、 csvファイルの文字コードと合っていますか? もし違うならFileInputStreamクラスとInputStreamReaderクラスを使って 文字コードを指定してファイルを読み込むようにしてください。 また、他のコードも???なところが・・・ >System.out.println(String.toString(str)); String#toString(String[]) のようなメソッドはないです。 >f(str.equals("五十音")){ini = j;} >if(str.equals("a")){wamei = j;} Stringの配列と文字列を比較しているので常にfalseになるはずです。

MASA0901
質問者

お礼

返信ありがとうございます。 返事が遅くなってすみません。 >Stringの配列と文字列を比較しているので常にfalseになるはずです。 この部分のケアレスミスでした。

関連するQ&A

  • 小文字、大文字変換

    こんにちは。 javaの勉強をやっているのでですが 思うとおりに進みません。 一文字ずつ小文字なら大文字に大文字なら小文字に変換するといったものです。 途中経過です。 import java.io.*; class Ex60{ public static void main(String args[])throws IOException{ String str3 ="0"; String output = "0"; String s1 = new String("end"); while(str3.equals(s1) == false ){ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); while(str3.equals(s1) == false ){ System.out.print(">"); str3 = br.readLine(); if(str3.equals(s1) == true) break; for(int i=0; i<str3.length(); i++){ char c = str3.charAt(i); if(Character.isLowerCase(c)) output = str3.toUpperCase(); else if(Character.isUpperCase(c)) output= str3.toLowerCase(); } System.out.println("入力された文字列は" + str3 + "です。"); System.out.println("大文字小文字を変換すると" + output + "です。"); } } } } /* 実行結果 >abc 入力された文字列はabcです。 大文字小文字を変換するとABCです。 >AbC 入力された文字列はAbCです。 大文字小文字を変換するとabcです。 >AAb 入力された文字列はAAbです。 大文字小文字を変換するとAABです。 */ 条件として一文字が大文字か小文字の判定にはCharacterクラスの isLowerCase()メソッド、isUpperCase()メソッド 一文字の変換はtoUpperCase()メソッド、toLowerCaseメソッドを使います。 どなたかよろしくおねがいします。

  • Javaの文字列比較について

    学校のJavaの課題で分からない問題がありました。習い始めたばかりなので全然うまくいきません。問題は、下のようです。 「円周率(3.14159265358979323846) の小数点以下の数値を一個ずつ入力していき、間違えたところでそこまでの桁数を表示するプログラムを作成しなさい。最大で小数点第20桁までとする。」です。 一応自分なりに考えてみたソースコードがこれです。 <ソースコード> import java.io.*; class Kadai0303 { public static void main(String[] args) throws IOException { String[] pied = {"14159265358979323846"}; int i; BufferedReader br= new BufferedReader(new InputStreamReader(System.in)); for(i=0;i<20;i++){ String str= br.readLine(); if(str.equals(pied)){ System.out.println(str[i]); } else{ break; } } System.out.println(i+1 + "桁まで正解"); } } おそらく文法も正しく書かれていないと思うので、馬鹿じゃないかと思うかもしれませんが、自分なりに考えてみたので、ぜひわかる方がいれば、間違っているところとどのように直したらいいかをサポートしてくださるとうれしいです。 P.S すいません。変なソースコードで。

    • ベストアンサー
    • Java
  • 三つの文字を順に並べるプログラム

    三つの文字を入力して、順番に並べて表示させるプログラムが作りたいのですが、どうしたらいいのかわかりません。 二つまではできました。以下に記します import java.io.*; class Sample { public static void main(String args[]) throws IOException { System.out.println("文字列1を入力してください。"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str1=br.readLine(); System.out.println("文字列2を入力してください。"); String str2=br.readLine(); int s = 1,t = 0; if(str1.length()>str2.length()){ int len=str1.length(); StringBuffer sb=new StringBuffer(str1); while(s<len+1){ sb.insert(s,str2.charAt(t)); s=s+2; t++; } System.out.println("文字列は"+sb+"となる。"); }else{ int len=str2.length(); StringBuffer sb=new StringBuffer(str2); while(s<len+1){ sb.insert(s-1,str1.charAt(t)); s=s+2; t++; } System.out.println("文字列は"+sb+"となる。"); } } } str1に123 str2に45といった風に入力すると14253といった風になります。 これにstr3を加え、str3が6789ならば、146257389 となる風にしたいです。

    • ベストアンサー
    • Java
  • コマンドプロンプトでひらがなの入力が出来ません。

    普段グーグル日本語入力を使っています。 OS XPsp2 import java.io.*; class Mojiretuate { public static void main(String[] args) throws IOException { String str = "こんにちは"; String str2; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.println("文字列当てゲームです。"); System.out.println("答えは何かのあいさつです。"); for(;;){ System.out.println("\n入力"); str2 = br.readLine(); System.out.println("入力文字列の長さ:" + str2.length()); if(str.equals(str2)){ System.out.println("正解です"); break; } else if(str2.length() > str.length()){ System.out.println("長すぎます。"); } else if(str2.length() == str.length()){ System.out.println("長さはあっています。"); } else{ System.out.println("短すぎます。"); } } System.out.println("終了"); } }

    • ベストアンサー
    • Java
  • 文字列について

    適当な文字列をキーボードから入力し、次に別の適当な整数numをキーボードから入力する。次に先に入力した文字列のnum番目からnum個の文字だけ逆順になるように文字列を並び替えた文字列を新たな文字列変数に代入し、その結果を画面に出力するプログラムを下記で作成したのですが、文字列時代が逆になってしまいます。どうしたら、 結果    文字列を入力      My name is Taro Sandai.    整数を入力     10    My name isdnaS oraT になるのですか? import java.io.*; class mojiretu4 { public static void main(String args[]) throws IOException { System.out.println("文字列を入力"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str1 = br.readLine(); System.out.println("整数を入力"); String str2 = br.readLine(); int num = Integer.parseInt(str2); StringBuffer sb = new StringBuffer(str1); sb.reverse(); System.out.println(sb);

    • ベストアンサー
    • Java
  • バイナリ文字列の比較について

    テキストをバイナリで読み込んで文字列を比較する際に 下記のロジックだと2バイトずつ読み込んで比較していくのですが 比較したい文字列が"He"だと合致するのですが1バイトずれの "el"だと合致しません。 ストリーム内の任意の文字列を判定したいときはどのように修正すればよいでしょうか? ----sample.txt--- Hello World!! ---------------- byte[] buf = new byte[2]; FileInputStream in = new FileInputStream("sample.txt"); int b; while ((b = in.read(buf)) != -1) { if ("He".equals(new String(buf))) { System.out.println("HelloのHeはOK"); } if ("el".equals(new String(buf))) { System.out.println("HelloのelはNG"); } }

    • ベストアンサー
    • Java
  • 文字列間の包含関係を調べるプログラム

    最近Javaを始めたばかりの初心者です。 キーボードから4つの文字列を読み込み、それらの文字列間の包含関係を調べるプログラムを作りたいのですが・・・ a,back,kick,ck と4つ入力したら、 aを含む  back backを含む  なし kickを含む  なし ckを含む  back  kick と出力する。 文字列が含まれる時の部分は以下のように作ってみたのですが、文字列が含まれない時に"なし"を1回だけ表示させる、というところが分かりません。(キーボード入力用のKeyBoard.classが別に用意してあります。) ヒントだけでも教えてもらえないでしょうか。 String[] S = new String[4]; for (int i = 0; i < 4; i++) {   S[i] = KeyBoard.readLine(); } for (int k = 0; k < 4; k++) {   System.out.println(S[k] + "を含む");   for (int j = 0; j < 4; j++) {     if (j != k) {       if (S[j].indexOf(S[k]) >= 0) {         System.out.println(" " + S[j]);       }     }   } }

  • 文字列について(続き)

    文字列について、あれから私がベストアンサーに選んだ回答を元に下記のプログラムを作成したのですが私が作成したプログラムで出た結果が下記のようになります。実行例のような結果を出すにはどのようにすればいいのですか?Java初心者なのでお願いします。 作成したプログラムで出た結果 文字列を入力 My name is Taro Sandai. 整数を入力 10 My name is.iadnaS oraT 実行例 文字列を入力 My name is Taro Sandai. 整数を入力 10 My name isdnaS oraT ai. import java.io.*; class K2 { public static void main(String args[]) throws IOException { System.out.println("文字列を入力"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str1 = br.readLine(); System.out.println("整数を入力"); String str2 = br.readLine(); int num = Integer.parseInt(str2); String str3 = str1.substring(0,num); String str4 = str1.substring(num); StringBuffer str5 = new StringBuffer(str4); str5.reverse(); System.out.println(str3+str5); } }

    • ベストアンサー
    • Java
  • javaについて

    キーボードから入力をして、その後str[0][0]とstr[1][0]の文字を繋げたいのですがエラーとなってしまいます。どう変えたらよいでしょうか。 以下がプログラムです。 import java.io.*; import java.lang.*; import java.net.*; import java.awt.*; class gugu3 { public static void main(String[] args) throws IOException { int KEYWORDMAX=10; int CNTMAX=100; String [][]str = new String[KEYWORDMAX][CNTMAX]; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String line=null; for (int i=0;i<KEYWORDMAX;i++){ System.out.println("第"+(i+1)+"番目のキーワードを設定しますか?(y/n)"); line=br.readLine(); if(line.equals("n")) break; for (int s=0;s<CNTMAX;s++){ System.out.println("キーワードを入力してください(終了=0)"); line=br.readLine(); if(line.equals("0"))break; str[s][i]=line; } } String keyword = new String(str[0][0]" "str[1][0]); System.out.println("キーワードは "+keyword); } } 以下はエラー表示です。 gugu3.java:24: ')' がありません。 String keyword = new String(str[0][0]" "str[1][0]); ^ gugu3.java:24: 文ではありません。 String keyword = new String(str[0][0]" "str[1][0]); ^ gugu3.java:24: ';' がありません。 String keyword = new String(str[0][0]" "str[1][0]); ^ エラー 3 個

    • ベストアンサー
    • Java
  • IF文と文字列の組み合わせについて

    今回、InputStreamReader、BufferedReaderクラスを用いての応答処理を返事次第で処理を分岐させるということを、IF文を用いて行うつもりでした。 ソースは以下の通りです。 import java.io.*; class test1{ public static void main(String[] args){ int num=0; do{ String str1; String str2; try{ InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); System.out.println("今日の日付を入力して下さい。"); str1=br.readLine(); System.out.println("今日の日付は"+str1+"でよろしいでしょうか?[はい/いいえ]"); str2=br.readLine(); if(str2.toString()=="はい"){ System.out.println("日付登録完了しました。"); }else if(str2.toString()=="いいえ"){ System.out.println("ただしい日付を入力して下さい。(1)"); num=1; }else System.out.println("ただしい日付を入力して下さい。(2)"); num=1; }catch(Exception e){ System.out.println("入力が正しくないです。"); num=1; } }while(num==1); } } 実際に処理をさせたときに、 c:\javasrc>java test1 今日の日付を入力して下さい。 8/1 今日の日付は8/1でよろしいでしょうか?[はい/いいえ] はい ただしい日付を入力して下さい。(2) 今日の日付を入力して下さい。 というように何を入力しても最終的にelseに返されてしまいます。 IF文と文字列の組み合わせが悪いのでしょうか…。 色々と考えてはみたものの解決策が見つかりませんでした。 どなたか詳しい方いましたら教えていただけると幸いです。 よろしくお願い致します。

    • ベストアンサー
    • Java

専門家に質問してみよう