アプリ版:「スタンプのみでお礼する」機能のリリースについて

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と表示できるかと思ったのですが、クエリで集計する湖と以外で、このような方向性で正しいでしょうか。たびたびで質問で申し訳ありません。
宜しくお願い致します。

A 回答 (7件)

続きみたいですが、前回を知らないので


はずしているかも知れませんが
26KYOUTO.CSV の一行が 26101 の場所を
カウントするコードでいいのならこれで
どうでしょう、出来る限りあなたのコードは
崩していません

import java.io.*;

public class Counter {
 public static void main(String args[]) {

  String file = "26KYOUTO.CSV";
  String line = null;
  int count = 0;

   if (args.length > 0) file = args[0];

   try {
    BufferedReader br =
     new BufferedReader(new FileReader(file));

    while ((line = br.readLine()) != null) {
     if (line.equals("26101")) count++;
    }

    br.close();
   } catch (Exception e) {
   } finally {
   }
   System.out.println(count);
  }
}

この回答への補足

hofchan様
アドバイス有難う御座います。
実は26KYOUTO.CSVとは郵便局のHPからダウンロードした郵便番号のファイルなんですが、結果を郵便番号が26101=24(件)、26102=2*(件)ではなく、北区=24(件)、下京区=2*件という形に設定できればとおもっているのですができずに四苦八苦しています。
集計し、結果を仕分けることは難しいことを実感しています。
今後も「Javaのカウント方法について」というタイトルで完成するまで記載するので、何かしら気づいた点がありましたら何卒よろしく御願い致します。

補足日時:2007/08/05 00:59
    • good
    • 0
この回答へのお礼

hofchan様
返信遅くなりました。
一応完成いたしましたので、ご報告致します。
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("入出力エラーです。");
}
}
}

お礼日時:2007/08/16 00:16

まず、26KYOUTO.csv を見て最初に書いたコードは


「次は東京都と北海道も集計してくれ」と言われた時に
Counter インターフェイスを実装した TokyoCounter と
HokkaiCounter を書けば事が足りるコードでした


ですが、それだとコードが少しだけ今より複雑になり
本来の質問の「京都府の区を集計する」事に対して
ta1999 さんが必要かどうかもわからない拡張を加え
逆にわかりにくくさせるのもどうかと考えて
簡略化したコードが #5 のコードです、本来は
出来る限りそんな風に書くのがいいと思います
# 実際それが必要になればデータベースかな?


それに対して #6 のコードは、一度京都の集計結果を
出して、それを別なファイルに保存してしまえば
そのプログラムはその集計結果のファイルがある限りは
もう使うことはありません、この理由で「使い捨てのコード」です
それをわざわざ Java で書くよりも、簡単に書ける
Perl で書いた方が楽かな、という意味です
    • good
    • 0
この回答へのお礼

hofchan様
返信、アドバイス有難う御座いました。
また、お礼のメールが遅くなり申し訳ありません。
『Java で書くよりも、簡単に書けるPerl で・・・・』ということだったんですね。ぱっと見た感じではPerlが簡単かわかりませんでしたが、
Perlにしろ、いずれ全てのプログラミング言語を作成してみようと考えています。その意味でさまざまな言語の経験がある方の意見は自分には大変貴重です。有難う御座います。
急いでいるとはいえ、今だデバック状態や、一部の苦手な文法の活用方法を見直している状態で、その後の経過をこのサイトに報告できず、申し訳ありません。
宜しくお願い致します。

お礼日時:2007/08/07 22:40

文字数の関係上わけます #5 です



  String[] index = {"\"京都市北区\"",
           "\"京都市上京区\"",
           "\"京都市左京区\"",
           "\"京都市中京区\"",
           "\"京都市東山区\"",
           "\"京都市下京区\"",
           "\"京都市南区\"",
           "\"京都市右京区\"",
           "\"京都市伏見区\"",
           "\"京都市山科区\"",
           "\"京都市西京区\""};

の部分を他の都道府県の区に書き換えて
別な都道府県のファイルを読み込ませても動く事を考えて
書きましたが、一部訂正です Analysis クラスの

  Counter[] count = new Counter[11];



  Counter[] count = new Counter[index.length];

とするべきですね、完全に使い捨てでよければ

-------------------------------------------------
package analysis;

import java.io.*;
import java.util.regex.*;

public class Analysis {
 public static void main(String args[]) {

  String line = null;

  int counter = 0;
  
  int kitaku = 0;
  int kamigyouku = 0;
// ここにそれぞれの区のカウンターを並べる(略)
  int saikyouku = 0;

  try {
   BufferedReader br =
    new BufferedReader(new FileReader("26KYOUTO.csv"));

   while (br.ready()) {
    String[] props = br.readLine().split(",");

    if (props[0].equals("26101")) kitaku++;
    else if (props[0].equals("26102")) kamigyouku++;
// ここにも同じ様に並べる(略)
    else if (props[0].equals("26111")) saikyouku++;

    counter++;
   }
   } catch (Exception e) {
   } finally {
   }

  System.out.println("北区\t:\t" + kitaku);
  System.out.println("上京区\t:\t" + kamigyouku);
// ここにも並べる(略)
  System.out.println("西京区\t:\t" + saikyouku);
  System.out.println("------------------------");
  System.out.println("+\t\t" + counter);
 }
}

--------------------------------------------------
でもいいでしょうが、こちらは本当に使い捨てです
perl なんかで書いて 1 ~ 2 回使って捨てるコードです
思ったより使用頻度が多ければ Java や C/C++ で書き直すといった
ところでしょうか、頑張ってください
    • good
    • 0
この回答へのお礼

hofchan様
No.5、6のご返信、アドバイス有難う御座いました。
また、お礼のメールが遅くなり申し訳ありません。
大変助かります!
現在内容を理解しながら、デバックを行っております。
それと「本当に使い捨てです」というのは?(ちなみにperlの経験はありません。)
素人的な質問で申し訳ありませんが、お時間があるときにご返信お願い致します。
宜しくお願い致します。

お礼日時:2007/08/06 23:00

------------------------------------------


// interface 無くてもいい
package analysis;

interface Counter {
 String getIndex();
 void setIndex(String index);
 void setCount();
 int getCount();
}
-------------------------------------------
// カウントをとるクラス
package analysis;

public class KyoutoCounter implements Counter {

 private int counter;
 private String index;

 public KyoutoCounter(String index) {
  this.index = index;
 }

 public String getIndex() {
  return index;
 }

 public void setIndex(String index) {
  this.index = index;
 }

 public void setCount() {
  counter++;
 }

 public int getCount() {
  return counter;
 }
}
------------------------------------------------------
package analysis;

import java.io.FileReader;
import java.io.BufferedReader;
import java.io.IOException;

public class Analysis {
 public static void main(String args[]) {

  String[] index = {"\"京都市北区\"",
           "\"京都市上京区\"",
           "\"京都市左京区\"",
           "\"京都市中京区\"",
           "\"京都市東山区\"",
           "\"京都市下京区\"",
           "\"京都市南区\"",
           "\"京都市右京区\"",
           "\"京都市伏見区\"",
           "\"京都市山科区\"",
           "\"京都市西京区\""};

  String line = null;
  String file = "26KYOUTO.csv";
  int counter = 0;

  if (args.length > 0) file = args[0];

  Counter[] count = new Counter[11];

  for (int i = 0; i < index.length ; i++) {
   count[i] = new KyoutoCounter(index[i]);
  }

  try {
   BufferedReader br;
    br = new BufferedReader(new FileReader(file));

   while (br.ready()) {
    String[] props = br.readLine().split(",");

    for (int i = 0; i < index.length ; i++) {
     if (props[7].equals(count[i].getIndex()))
      count[i].setCount();
    }

    counter++;
   }
  } catch (Exception e) {
  } finally {
  }

  for (int i = 0; i < index.length; i++) {
   System.out.println(count[i].getIndex()
         + "\t:\t" + count[i].getCount());
  }

  System.out.println("---------------------------");
  System.out.println("+\t\t" + counter);
 }
}

----------------------------------------------
実行結果
----------------------------------------------
"京都市北区" : 360
"京都市上京区" : 660
"京都市左京区" : 506
"京都市中京区" : 556
"京都市東山区" : 214
"京都市下京区" : 601
"京都市南区" : 266
"京都市右京区" : 556
"京都市伏見区" : 628
"京都市山科区" : 290
"京都市西京区" : 255
---------------------------
+ 6657

少し無理矢理な感じします
このあたりは、本当は Perl なんかで
使い捨てにするコードです、長く使う必要が
あればデータベースがいいですね
    • good
    • 0

26KYOUTO.CSV というファイルを


郵便局の HP から DL されたということは
一般公開されているファイルですよね?

差し支え無ければ 2 ~ 3 行書き出す、または
その DL ページへのリンクがあれば回答が
付けやすいです

最終確認として
>そのCSVには各市町村の町名までの郵便番号総一覧がありますので
>それを市町村別に集計し、結果を表示したいと考えています

これは 北区=***** の形ということですから、市町村にまで分ける
というより、それぞれの「区」の集計を表示させるということですよね?
つまりは標準出力で
---------------------------------
北区 = 24
下京区 = ***
---------------------------------
とするだけでしょうか?
だとすれば CSV を見れば普通に出来ると思いますよ

この回答への補足

hofchan様
早速のご返信、アドバイス有難う御座います。
DL ページへのリンクは
http://www.post.japanpost.jp/zipcode/dl/oogaki.h …
からダウンロードしました。

---------------------------------
北区 = 24
下京区 = ***
---------------------------------
仰るとおり以上の形で表示させたいです。
ただ、自分ではQNo.3225750で公開した方法でしか今だわかりません。例えば北区だけの集計はできても、それぞれの「区」の集計という表示までは中々おもいつきません。後は配列やソートを行わなければ表示は難しいと考えていますが・・・
まだまだ初心者レベルでご教授頂ければと思います。
何か補足点あれば何なりと仰ってくださればと存じます。
よろしく御願い致します。

補足日時:2007/08/05 19:47
    • good
    • 0

やろうとされている事がなんとなく分かったような


気もしますが、疑問もあります
まず、その .csv は " , " で区切られたあの CSV です
よね?
だとすれば、そのファイルをどの様に解析したいのでしょうか?
北区= **** にしたいという事は
京都府の中から京都市に分けて、さらに解析するのでしょうか?
これをデータベース無しでやると言うことですよね
CSV を見てそれをどんな仕様にしたいのか
例えば
(北区と入力すれば 北区= の形になる)
(ただ標準出力で 北区= 下京区= の形にする)
等が分からなければなければ何とも言えませんが

>if(line.equals("26101")){//配列を設定?
これは配列では無く String line が 26101 と等価であれば
true をかえします

>System.out.println("京都府北区=" +count );
これは標準出力で 京都府北区=******* // ****** はカウント数です

つまりは、ファイルに 26101 と書かれた行は何行あるのかを
調べているだけです
# CSV だとおかしい気もします .....

この回答への補足

hofchan様
早速のご返信、アドバイス有難う御座います。
.csv は " , " で区切られたあの CSV です
よね?
→はい、郵便局のHPからダウンロードしたカンマ区切りのファイルです。
だとすれば、そのファイルをどの様に解析したいのでしょうか?
京都府の中から京都市に分けて、さらに解析するのでしょうか?
→はい、そのCSVには各市町村の町名までの郵便番号総一覧がありますので、それを市町村別に集計し、結果を表示したいと考えています。
京都府の中から京都市に分けて、さらに解析するのでしょうか?
これをデータベース無しでやると言うことですよね
CSV を見てそれをどんな仕様にしたいのか?
→はい、京都市の各市町村にわけます。できればDBなしでCSVの中で
北区=**という形で抽出したいと考えています。
ただ今のロジックでは全市町村別に集計し、さらに結果を表示するのは難しく色々ご質問した限りです。
ロジックを再度思考中ですが、また何かしらのご鞭撻いただければと存じます。
宣しく御願い致します。

補足日時:2007/08/05 03:37
    • good
    • 0

どうも、neko_nokoです。


ご指名いただいたので、回答します。

>当然郵便番号が26101=24(件)、26102=2*(件)となってしまい、
>北区=24(件)、下京区=2*件という形にしたければ

DBを使わないとすれば、Hashtableなどを使ってみてはどうでしょうか?
キーを郵便番号、値を住所にすれば値の取得もやりやすいと思います。
    • good
    • 0
この回答へのお礼

neko_noko様
早速のご返信、アドバイス有難う御座いました。
「Hashtable」はあまり使ったことがありませんが、作ってみようと思います。
いずれ時間が取れ次第、DBを使った方法でも作成しようと思います。
また、完成するまで今後の詳細は載せようと思います。
お時間があるときに見て頂ければ幸いです。
有難う御座いました。

お礼日時:2007/08/04 23:51

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!