• 締切済み

javaでcsvファイル処理

プログラミング初心者の者です。 以下の様なデータの入った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ファイルを読み込んで、吐き出す事だけはできているので、 間にどんなプログラムを書けば良いのか、ヒントを頂ければ幸いです。 宜しくお願い致します。

みんなの回答

回答No.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);   }  } }

  • hatimiti
  • ベストアンサー率68% (26/38)
回答No.1

・#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 をセットします。

関連するQ&A