- ベストアンサー
データの並び替え
今、 a 001 1 a 002 1 b 002 2 b 003 2 c 001 2 c 002 4 c 004 3 d 003 2 d 005 1 e 006 4 このように並んでいる表を 001 002 003 004 005 006 a 1 1 0 0 0 0 b 0 2 2 0 0 0 c 2 4 0 3 0 0 d 0 0 2 0 1 0 e 0 0 0 0 0 4 というような表に書き換えたいのですが、 何かいい方法はないでしょうか? データ数が膨大なので、EXCELなどでやるわけにもいかず困っています。 javaでプログラムを組もうと思っているのですが、 具体的にどのようにすればいいものでしょうか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
a 001 1 というデータの、"a"の部分をY座標に。"001"の部分をX座標に変換できる関数を作れば、配列として扱えるようになるので、後は楽だと思います。 データの仕様が書かれていないので、適当に想像して書いてみました。 表の大きさ(X,Yの最大値)が決まっていれば、サンプルのように配列でいいですが、これが未定の場合は、Mapなどを使うと良いと思います。 static String[] lines = { "a 001 1", "a 002 1", ~中略~ "e 006 4", }; public static void main(String[] args){ int [][] values = new int[10][10]; //ここでは、10x10の表とする //読み込んだデータを1つずつ処理する for (int i = 0; i < lines.length; i++){ String[] elements = lines[i].split(" "); //スペースで分割 int x = getX(elements[1]); int y = getY(elements[0]); values[y][x] = Integer.parseInt(elements[2]); //数値化 } //valuesの中身を確認 for (int y = 0; y < values.length; y++){ for (int x = 0; x < values[y].length; x++){ System.out.print(values[y][x] + ","); } System.out.println(); } } private static int getY(String s){ return (int)(s.charAt(0) - 'a'); //a->0, b->1, c->2に変換 } private static int getX(String s){ String temp = s.replaceAll("^[0]+", ""); //先頭の0を除去 return Integer.parseInt(temp) - 1; //数値化して-1する }
その他の回答 (3)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
試しに作ってみました。 適宜状況に合わせて変更して下さい。 ---------------------------------------------------------------- import java.io.*; import java.util.*; class Convert { public static void main(String args[]){ Scanner sc = null; TreeSet<String> tsn = new TreeSet<String>(); TreeSet<String> tsi = new TreeSet<String>(); TreeMap<String,Integer> tm = new TreeMap<String,Integer>(); String inName=""; String inIndex=""; int inNum=0; try{ sc = new Scanner(new File("data.txt")); while(sc.hasNext()){ inName = sc.next(); tsn.add(inName); inIndex = sc.next(); tsi.add(inIndex); inNum = sc.nextInt(); tm.put(inName+":"+inIndex, inNum); } sc.close(); } catch(FileNotFoundException e){ System.out.println("ファイルが無い:" + e); } catch(InputMismatchException e){ System.out.println("データ不良:" + e); } for(String index : tsi){ System.out.print(" " + index); } System.out.println(); for(String s : tsn){ System.out.print(s); for(String i : tsi){ System.out.print(" " + ((tm.get(s+":"+i)==null)? 0 : tm.get(s+":"+i))); } System.out.println(); } } }
お礼
No.2に加え、プログラムを組んでいただき本当にありがとうございました。 勉強不足でまだわからないところもあるのですが、 ぜひぜひ参考にさせていただきます。 本当にありがとうございました。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
Mapを使ってできるんじゃないかな。 もし、データ数が大きすぎて処理できないのであれば、 最初にa,b,c…のような処理リストを作って、 aだけを処理して出力 bだけを処理して追加出力みたいな感じでいいんでないでしょうか
- fortranxp
- ベストアンサー率26% (181/684)
このような場合データ数が膨大では 解決に向かわないと思います。 1.a 001 1 形式で何件ですか? 2.そのデータはいまありますか? 3.そのデータはどんな状態ですか?(紙、txt,csv etc)
補足
会社で保存しているので今は手元にはないのですが、 データ数は、約7万件で、csv形式で保存しています。 やはり難しいのでしょうか。。。
お礼
丁寧な解説つきでとても分かりやすかったです。 ぜひぜひ参考にさせていただきたいと思います。 本当にありがとうございました。