電子書籍の厳選無料作品が豊富!

プログラミング初心者の者です。
以下の様なデータの入ったcsvファイルを、javaで処理しなければならなくなりました。
#1 #2 #3
B 00 00 00
A 00 00 00
C 00 00 00
B 00 00 00
A 00 00 00
D 00 00 00
C 00 00 00
A,B,C,Dそれぞれのデータを、#1,#2,#3それぞれのテーマで集計
したいのですが、どういったプログラムを書けばいいのかよくわかりません。
csvファイルを読み込んで、吐き出す事だけはできているので、
間にどんなプログラムを書けば良いのか、ヒントを頂ければ幸いです。
宜しくお願い致します。

A 回答 (2件)

Java 勉強中です。



入力 dat:
Header
B,3,1,8,3,0
A,5,5,1,1,1
C,1,3,5,4,4
B,8,7,7,5,2
D,1,8,8,1,8
C,0,2,2,1,2

出力:
A,5,5,1,1,1
B,11,8,15,8,2
C,1,5,7,5,6
D,1,8,8,1,8

コマンドラインで
 java Main < dat
とやっています。


Main.java:
import java.util.*;
public class Main {
 private static Scanner in;
 private enum Alphabetic {
  A
  , B
  , C
  , D
 }
 public static void main(String[] args) {
  EnumMap<Alphabetic, ArrayList<Integer>> total =
    new EnumMap<Alphabetic, ArrayList<Integer>>(Alphabetic.class);
  for (Alphabetic a: Alphabetic.values()) {
   total.put(a, new ArrayList<Integer>());
  }
  in = new Scanner(System.in);
  in.nextLine(); // ignore header
  while (in.hasNextLine()) {
   Scanner field = new Scanner(in.nextLine()).useDelimiter("\\s*,\\s*");
   String candidate = field.next();
   Alphabetic series = null;
   for (Alphabetic a: Alphabetic.values()) {
    if (candidate.equals(a.name().toString())) series = a;
   }
   if (total.get(series).isEmpty()) {
    while (field.hasNext()){
     total.get(series).add(new Integer(field.next()));
    }
   }
   else {
    for (int i = 0; i < total.get(series).size(); i++) {
     int addee = total.get(series).get(i);
     total.get(series).set(i, addee + new Integer(field.next()));
    }
   }
  }
  for (Alphabetic series: Alphabetic.values()) {
   StringBuilder sb = new StringBuilder();
   sb.append(series.name());
   for (int e: total.get(series)) {
    sb.append(","); sb.append(e);
   }
   System.out.println(sb);
  }
 }
}
    • good
    • 0

・#1 集計用の Map(key=A or B or C, value=集計値) 変数を用意


・#2 集計用の Map(key=A or B or C, value=集計値) 変数を用意
・#3 集計用の Map(key=A or B or C, value=集計値) 変数を用意

while (csv の行数分ループ) {
 ・key = 1列目の文字を取得(Map の key となる)
 ・map に集計値をセット
  #1Map.put(key, #1Map.get(key) + csv 2 列目の値)
  #2Map.put(key, #2Map.get(key) + csv 3 列目の値)
  #3Map.put(key, #3Map.get(key) + csv 4 列目の値)
}

なんか汚いですね、、、
map から get したときの null チェックも必要ですね。
列やA/B/Cが可変なら、もっと別の方法が良さそうです。

参考程度に見てください。
Map は key に対する value を管理するクラスです。
get(key) でその key に対する value を取得し、
put(key, value) でその key に対する value をセットします。
    • good
    • 0

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