• ベストアンサー

データの並び替え

今、 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でプログラムを組もうと思っているのですが、 具体的にどのようにすればいいものでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • sasadora
  • ベストアンサー率68% (59/86)
回答No.3

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する }

hiroko-0120-
質問者

お礼

丁寧な解説つきでとても分かりやすかったです。 ぜひぜひ参考にさせていただきたいと思います。 本当にありがとうございました。

その他の回答 (3)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

試しに作ってみました。 適宜状況に合わせて変更して下さい。 ---------------------------------------------------------------- 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(); } } }

hiroko-0120-
質問者

お礼

No.2に加え、プログラムを組んでいただき本当にありがとうございました。 勉強不足でまだわからないところもあるのですが、 ぜひぜひ参考にさせていただきます。 本当にありがとうございました。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

Mapを使ってできるんじゃないかな。 もし、データ数が大きすぎて処理できないのであれば、 最初にa,b,c…のような処理リストを作って、 aだけを処理して出力 bだけを処理して追加出力みたいな感じでいいんでないでしょうか

  • fortranxp
  • ベストアンサー率26% (181/684)
回答No.1

このような場合データ数が膨大では 解決に向かわないと思います。 1.a 001 1 形式で何件ですか? 2.そのデータはいまありますか? 3.そのデータはどんな状態ですか?(紙、txt,csv etc)

hiroko-0120-
質問者

補足

会社で保存しているので今は手元にはないのですが、 データ数は、約7万件で、csv形式で保存しています。 やはり難しいのでしょうか。。。

関連するQ&A