- 締切済み
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ファイルを読み込んで、吐き出す事だけはできているので、 間にどんなプログラムを書けば良いのか、ヒントを頂ければ幸いです。 宜しくお願い致します。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- MillenniuM
- ベストアンサー率58% (42/72)
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)
・#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 をセットします。