Javaのカウント方法について

このQ&Aのポイント
  • CSVで取り込んだデータの抽出方法を知りたい。
  • 取り込んだ郵便番号をカウントしてCSVファイルに出力したい。
  • Javaのプログラムでデータのカウントがうまくいかない。
回答を見る
  • ベストアンサー

Javaのカウント方法について

お伺い致します。 CSVで取り込んだデータの抽出をしたいのですが、方法が見出せません。どの点を直せば宜しいのでしょうか。 具体的には取り込んだ郵便番号をカウントして(例:京都市,34)CSVファイルに出力するように出したいのですがカウントがうまくできません。(以下、コメントアウトしたものがありますが、今までのソースを記載します) 宜しく御願いします。 import java.io.FileReader; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.IOException; import java.io.*; public class test01 { static String fname ="26KYOUTO.CSV"; public static void main(String[] args){ if(args.length>0) fname = args[0]; try { BufferedReader reader = new BufferedReader(new FileReader(fname)); BufferedWriter pw = new BufferedWriter(new PrintWriter("orig.txt")); String line = reader.readLine(); System.out.println(line); pw.println(""); int n = 0; int count = 0; _/* while(true) { String line = reader.readLine(); if(line.equals("26101")) break; count++; } */ reader.close(); System.out.println("京都府北区=" +count ); } catch(FileNotFoundException e) { System.out.println("ファイルがありません。"); } catch(IOException e) { System.out.println("入出力エラーです。"); } } }

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

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

  • ベストアンサー
  • neko_noko
  • ベストアンサー率45% (146/319)
回答No.1

このコードをざっと見たところ、このプログラムの仕様は、 1.「26KYOUTO.CSV」というテキストファイルを開いて、 2.ファイルを1行ずつ読み込んでいき、 3.行の値が「26101」になるまで行数をカウントし、「26101」というデータのある行が出たらストップ。 4.その行までの行数を表示する。 という仕様に解釈できます。 これで合ってますか? また、CSVファイルなのに、 >String line = reader.readLine(); で、行の値を読み込み、カンマを配列などに加工することもなく、 >if(line.equals("26101")) break; で、行の値(つまりline)をそのままチェックに使ってますが、これも問題ないですか?

ta1999
質問者

お礼

neko_noko様 返信遅くなりました。 一応完成いたしましたので、ご報告致します。 26KYOUTO.CSVファイルの一行目の不要なファイルをカウントしないようにしなければなりませんが、このように完成しました。 今まで有難う御座いました。 import java.io.FileReader; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.*; import java.util.StringTokenizer; public class Csv_0809{ static String fname = "26KYOUTO.CSV"; public static void main(String[] args) { if(args.length>0)fname = args[0]; try{ BufferedReader reader = new BufferedReader(new FileReader(fname)); String line = reader.readLine(); String globalNumber = ""; int count = 1; String address = ""; int rowcount = 0; while(line != null) { StringTokenizer st = new StringTokenizer(line,","); String number = st.nextToken(); if(number.equals(globalNumber)) { count++; for(int i = 0; i < 7; i++){ address=st.nextToken(); } } else { if(rowcount != 0){ System.out.println(address + count); } count = 1; globalNumber = number; } line = reader.readLine(); rowcount++; } reader.close(); }catch(FileNotFoundException e) { System.out.println("ファイルがありません。"); }catch(IOException e){ System.out.println("入出力エラーです。"); } } }

ta1999
質問者

補足

neko_noko様 早速のご質問、アドバイス有難う御座います。 また、返信が遅くなり申し訳ありません。 お答えいたします。 1.26101、これは26101が郵便局のHPから京都府の「26KYOUTO.CSV」を取り出し、北区は共通の番号が「26101」だったのでこれをカウントすれば、北区の郵便番号が幾つあるかがわかるプログラムを作成中です。各市町村別にカウントしようとしています。 また「26101」は北区の郵便番号がなくなるまで振られています。 2.「CSVファイルなのに、・・・・」という点は、CSVファイルを取り込むことができても、その中にある特定の文字列をカウントする方法が 全くわからなかったので苦肉に策です。 import java.util.regex.Matcher;や import java.util.regex.Pattern;を使い カウントできるか現在取り組んでいますが、郵便番号の集計は遅々として進まない状態です。取り込んだデータをさらにデータ別(郵便番号の件数集計)をどうすればよいか・・・・・ 何卒、宜しく御願いします。

その他の回答 (1)

  • neko_noko
  • ベストアンサー率45% (146/319)
回答No.2

No1です。およそ状況がつかめました。 まずは、1つの郵便番号のカウントができるようにしていきましょう。 で、なぜカウントがおかしいかですが、これはコメントになっているwhile文の問題です。 >if(line.equals("26101")) break; となってますが、これだとlineが26101と一致した場合、 その次のbreakが効いて、whileループを抜けてしまいます。 テキストファイルを1行ずつ読み込んでいく場合のよくある書き方は次のような感じです。 String line = reader.readLine(); while(line!=null) {  //ここに1行ごとに行う処理を書く    //次の行を読み込み  line = reader.readLine(); } まず、whileに入る前に最初の行を読み込んでおきます。 whileが見る条件は読み込んだlineがnullかどうかです。 nullでなければwhileを続けます。 while内では、1行ごとに行う処理を書きます。 処理が長かったり複雑ならメソッドを呼び出すようにすると見やすくなります。 その後で、次の行を読み込むためにline = reader.readLine()を実行します。 これでlineは次の行を読み込みます。 1行ごとに行う処理ですが、とりあえずは読み込んだ文字が26101に一致すればカウントする、 ということにしておくなら、  if(line.equals("26101")){   count++;  } という感じでしょうか。これでとりあえずのカウントはできると思います。 ちなみにCSVなどのように特定の文字で分割されたデータを分割する場合は、 StringTokenizerクラスがよく使われます。 StringTokenizer st = new StringTokenizer(line, ","); というようにすると、","で区切られた文字列の集合が取れます。 ※ただし、このやり方は厳密には正しくないです。 集計に関してですが、プログラムだけでやるとすればかなり大変かもしれません。 もしかすると、いいやり方(アルゴリズム)があるかもしれないですが、 自分では思いつきませんでした。 可能ならデータベースに全てのデータを追加してクエリで集計、とした方が早いかもしれません。

ta1999
質問者

補足

neko_noko様 ご返信、アドバイス有難う御座いました。 「集計に関してですが、プログラムだけでやるとすればかなり大変かもしれません。」という点、確かに自分もそう思いました。集計に関してはmysql(Java+mysqlという形で行おうと思います。経験はありませんが・・・)で挑戦してみようと思います。また具体的なアドバイス大変参考になりました。行ってみます。 お礼が遅くなってしまいますのでまずはご連絡させて頂きました。 詳細については、再度ご連絡いたします。 よろしく御願い致します。

関連するQ&A

  • Javaのカウント方法について

    neko_noko様 補足の項目がなかったので新規質問という形ですが、Javaのカウント方法について続きで伺います。 import java.io.FileReader; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.IOException; import java.io.*; public class test01 { static String fname ="26KYOUTO.CSV"; //Stringtoknizer st = new Stringtoknizer(line,","); public static void main(String[] args){ if(args.length>0) fname = args[0]; try { BufferedReader reader = new BufferedReader(new FileReader(fname)); int count = 0; String line = reader.readLine(); while(line != null) { if(line.equals("26101")){//配列を設定? count++; } line = reader.readLine(); } reader.close(); //この部分で配列をソート? System.out.println("京都府北区=" +count ); } catch(FileNotFoundException e) { System.out.println("ファイルがありません。"); } catch(IOException e) { System.out.println("入出力エラーです。"); } } } のようにしましたが、仮に集計できても、当然郵便番号が26101=24(件)、26102=2*(件)となってしまい、北区=24(件)、下京区=2*件という形にしたければ、『if(line.equals("26101")){』の部分で文字列の配列を設定し、『reader.close();』の後に配列で計算したものをソートすれば北区=24と表示できるかと思ったのですが、クエリで集計する湖と以外で、このような方向性で正しいでしょうか。たびたびで質問で申し訳ありません。 宜しくお願い致します。

    • ベストアンサー
    • Java
  • Java初心者です。どうぞお教えください。

    CSVファイルを読み込んで、ソートしてから、現在日時のファイル名でCSVで書き出します。以下のファイルでは、CSVで書き出せません。現在日時のファイル名をつける方法もよくわかりません。どうぞ教えてください。importは省略しています。 public class CSVdata { public static void main(String[] args) { String fname = " " ; ArrayList<String> list = new ArrayList<String>(); String save_filename = getFileName(); if(args.length>0) { fname = args[0]; } try { BufferedReader reader = new BufferedReader( new FileReader(fname) ); String Line = null; while ((Line = reader.readLine()) != null) { list.add(Line); } reader.close(); Collections.sort(list ); PrintWriter writer = new PrintWriter(new BufferedWriter(new FileWriter(save_filename + ".csv"))); for (String string : list) { writer.println(string); } writer.close(); } catch (FileNotFoundException e) { System.out.println("ファイルがありません"); } catch (IOException e) { System.out.println("ファイルがありません"); } } public static String getFileName(){ Date d = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss"); return sdf.format(d); } }

  • CSV読み込み 文字化け

    失礼いたします。 以前のログを見てエンコードを設定してみたのですが、出力が文字化けします。ローカルファイルを読み込んでコンソール出力しているだけなのですが・・・。 分かる方、よろしくお願いします。 -------------------ソースはここから import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; // import java.io.FileReader; FileReaderからInputStreamReaderに変更済み import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class ReadCSV { public static void main(String[] args) { try { File csv = new File("C:\\AP.csv"); // BufferedReader br = new BufferedReader(new FileReader(csv)); BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(csv),"EUC_JP")); // BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(csv),"MS932")); while (br.ready()) { String line = br.readLine(); StringTokenizer st = new StringTokenizer(line, ","); while (st.hasMoreTokens()) { System.out.print(st.nextToken() + "\t"); } System.out.println(); } br.close(); } catch (FileNotFoundException e) { キャッチ処理 }

    • ベストアンサー
    • Java
  • 今勉強中のjavaで。わからないことがあります。

    import java.io.*; class Ireru { public static void main(String args[]) throws IOException{ System.out.println("あなたは何歳ですか?"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str1 = br.readLine(); int num =Integer.parseInt(str1); System.out.println("あなたは" + num +"歳です。"); } } ------------------------------- import java.io.*; class Ireru { 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("あなたは" + str1 +"歳です。"); } } なぜ下では悪いのですか?なぜnum をつかないといけないかがわかりません。正確には str1とnumの違いがわからなくて困っています。何が混乱の原因ですか?

    • ベストアンサー
    • Java
  • javaでCSVの中身から最大値を表示したい

    タイトルの通りなのですが、javaのプログラムでCSVの中の少数を読み込み、そこから最大値を表示したいのです。 CSVの中身は 10.1,20.2,30.3,40.4,50.4 100.1,200.2,300.3,400.4 という半角の少数がカンマで区切られた状態になっています。 import java.util.Scanner; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; public class test { public static void main(String args[]) throws NumberFormatException, IOException{ System.out.println("csvのファイル名を入力"); Scanner sc = new Scanner(System.in); String str = sc.next(); BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(str))); String line; while((line=br.readLine())!=null){ String[] sp = line.split(","); double sum=0;//合計値格納用 for(int i=0;i<sp.length;i++){ sum += Double.parseDouble(sp[i]); } System.out.println(line+"の合計値は"+sum); } br.close(); } } 上記のプログラムは、CSVの中身の各行の合計値を算出するもので、これを元に各行の最大値を算出したいのですが、どうしても比較演算子を使用しての算出がうまくいきません。 どなたかプログラムに詳しい方がいましたら、ご教授いただけると助かります。 つたない文章ですがよろしくお願いします。

    • ベストアンサー
    • Java
  • Vectorの使用法

    現在、課題の作成中なんですけどうまくいかないので教えてください。 ファイルに表示されているアクセスログファイルを別のファイルに表示させるコードなんですが、 import java.util.*; import java.io.*; public class AccessLog{   public static void main(String args[]){     if(args.length != 1){  System.exit(0);     }     String filename = args[0];     Vector vector = new Vector();     try{      String line ; BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); PrintWriter writer = new PrintWriter(new BufferedWriter(new FileWriter(filename))); while((line = reader.readLine()) != null){ vector.addElement(line); writer.println(vector); } }catch(IOException e){   System.out.println(e); }   } } Vectorの使い方がよくわからないので教えてください。宜しくお願いします。

  • CSVファイルを列ごとに読み込む処理について

    はじめまして。 よろしくお願いいたします。 プログラミングに興味をもち、JAVAに触れている者です。 現在eclipseでCSVファイルを列ごとに読み込んで表示する、というプログラムを作成しているのですが、コンパイルエラーを除去することができません。 エラー内容は 「処理されない例外の型 FileNotFoundException」 です。 これを見る限りでは読み込むファイルがないということらしいのですが、CSVファイルはちゃんと作成し、作成中のプログラムのファイルがあるディレクトリに置いてあります。 原因を探したいのですが、eclipseのこともjavaのこともよくわかっていないため、まるで見当がつきません。 どうかご教示をお願いいただけませんでしょうか? 以下が作成中のプログラムです。 package ioTest; import java.io.BufferedReader; import java.io.File; import java.io.InputStreamReader; import java.io.FileInputStream; public class IOsample { public static void main (String[] args){ BufferedReader br = null; File csv = new File("sampleCSV.csv"); br = new BufferedReader( new InputStreamReader( new FileInputStream(csv))); while (br.ready()){ System.out.println(br.readLine()); } br.close(); } } レベルの低い質問で申し訳ありませんが、なにとぞよろしくお願いいたします。

    • ベストアンサー
    • Java
  • 下記のようなjavaのプログラムで、* や / を入力しても,

    下記のようなjavaのプログラムで、* や / を入力しても, 必ず判定がfalseのほうになるんですけど、どうすれば良いですか? あまりjavaには詳しくないので、分かりやすく教えていただければ幸いです。お願いします。 import java.io.*; public class test{ public static void main(String[] args) throws IOException{ BufferedReader input = new BufferedReader(new InputStreamReader(System.in)); String a; a = input.readLine(); if((a == "*") ^ (a == "/")){ System.out.println("OK"); }else{ System.out.println("エラー"); } } }

    • ベストアンサー
    • Java
  • NTEmacsでJavaのコンパイルをしたいです

    NTEmacsのシェルです。 Javaの勉強をつい最近始めました。JDKは入っていて、普段はjavac、javaは普通に動くのですが、import java.io.*;のようなことをすると、(パーケージを読みこませる等)その部分でエラーになってしまいます。 ただ、eclipseで同様のものを作ると、コンパイルはうまくいきます。 例 import java.io.*; class Sample4{ public static void main(String[] args) throws Exception { System.out.println("please imput something"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = br.readLine(); System.out.println(str); } } 結果 c:\Users\***\Documents\Java>javac no_3.java javac no_3.java no_3.java:33: エラー: class、interfaceまたはenumがありません import java.io.*; ^ エラー1個

    • ベストアンサー
    • Java
  • JAVAのソートプログラムについて

    List1.txtの内容の単語の数を数え、その数を単語の隣に表示するプログラムを作りました。 (1)List1.txtの内容 ゲーム ゲーム 麻雀 麻雀 野球 ゲーム (2)実行結果 C:\>java Lists ゲーム 3 野球 1 麻雀 2 (3)プログラム import java.io.BufferedWriter; import java.nio.charset.Charset; import java.util.Map; import java.util.Map.Entry; import java.util.Scanner; import java.util.TreeMap; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.InputStreamReader; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; import java.util.List; import java.util.*; public class Lists { public static void main(String[] args) throws IOException{ File file3 = new File("C:\\List1.txt"); BufferedReader br3 = new BufferedReader(new FileReader(file3)); FileWriter filewriter3 = new FileWriter(file3,true); TreeMap<String,Integer> tm = new TreeMap<String,Integer>(); String line; while((line = br3.readLine()) != null){ String[] words = line.split("\\s"); for(String s : words){ if(!tm.containsKey(s)){ tm.put(s,1); }else{ tm.put(s,tm.get(s).intValue()+1); }} } for(String s : tm.keySet()){ System.out.println(s + " " + tm.get(s) ); }}} このプログラムを上から単語の数が多い順に表示したいのですがどこをどう修正したらいいのか悩んでます。 C:\>java Lists ゲーム 3 麻雀 2 野球 1 と表示されればOKです。 よろしくお願いします。

    • ベストアンサー
    • Java

専門家に質問してみよう