• 締切済み

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

  • Java
  • 回答数2
  • ありがとう数3

みんなの回答

回答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

  • JavaでCSVファイルの読み込みについて教えてください

    質問失礼します。 現在javaのプログラミングでCSVファイルを扱っています。 もしかすると初歩的な質問かもしれませんが、例えば   1 2 3 4 5 ・・・・ A 23 12 43 21 23 ・・・・ B 45 32 21 23 44 ・・・・ C ・ ・ ・ ・ ・ D ・ ・ ・ ・ ・ 上のようにExcel風にCSVファイルができているとして、例えば2列目B行のデータを読み込みたいといった場合、ピンポイントで指定した値を読み込む方法はあるのでしょうか? よろしくお願いします。

  • CSVファイルを列ごとに読み込む処理について

    はじめまして。 よろしくお願いいたします。 プログラミングに興味をもち、JAVAに触れている者です。 現在eclipseでCSVファイルを列ごとに読み込んで表示する、というプログラムを作成しているのですが、コンパイルエラーを除去することができません。 エラー内容は 「処理されない例外の型 FileNotFoundException」 です。 これを見る限りでは読み込むファイルがないということらしいのですが、CSVファイルはちゃんと作成し、作成中のプログラムのファイルがあるディレクトリに置いてあります。 原因を探したいのですが、eclipseのこともjavaのこともよくわかっていないため、まるで見当がつきません。 どうかご教示をお願いいただけませんでしょうか? 以下が作成中のプログラムです。 package ioTest; import java.io.BufferedReader; import java.io.File; import java.io.InputStreamReader; import java.io.FileInputStream; public class IOsample { public static void main (String[] args){ BufferedReader br = null; File csv = new File("sampleCSV.csv"); br = new BufferedReader( new InputStreamReader( new FileInputStream(csv))); while (br.ready()){ System.out.println(br.readLine()); } br.close(); } } レベルの低い質問で申し訳ありませんが、なにとぞよろしくお願いいたします。

    • ベストアンサー
    • Java
  • CSVファイルの処理方法

    PerlでCSVファイルの処理をしようとしています。 CSVファイル(ここではdata1.csvとします)の中身は、A列とB列に数値が1000行程表記されています。 -5,1 -4,2 -3,3  ・  ・  ・ 作成したPerlのファイル(ここではtest1.plとします)下のようにし、 while ($_=<stdin>){ print"$_\n"; } Cygwinコマンド上で、 $ perl test1.pl <data1.csv と入力すると、CSVファイル(data1.csv)の数値がCygwinコマンド上に全て表記されます。 前置きが長かったのですが、CSVファイル(data1.csv)の3行目までの数値だけをCygwinコマンド上に表記したい場合、どのようにプログラムすればよいのですか。 お願いします。

    • ベストアンサー
    • Perl
  • Perlでのファイル処理方法について

    プログラミングを始めたばかりです。 Cygwin環境でPerlを行っています。計算プログラムをPerlで書いています。 下に示すように、計算プログラムの中にデータを記入し、そのデータを処理することは出来たのですが、外部のファイルを読みそのデータを処理する方法が分かりません。 # y = ax + bを求める @x=(1,2,3); @y=(1,4,9); for(<stdin>){ for($i=0;$i<$n;$i++){ $A = $A + ($y[$i] * $y[$i]); $B = $B + ($x[$i] * $x[$i]);   ・   ・   ・ $a=・・・ $b=・・・ print("a=$a,b=$b"); open (IN, $file) or die "$!"でcsvファイルに記載されてある数値をCygwin上で実行することは出来ました。 作成したプログラムとcsvファイルをCygwinで入力して、入力したcsvファイルのデータを処理(直線近似して傾きを求めたりなど)したいのですが、どうすればよいのでしょうか。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • CSVファイルのダウンロード方法について

    CSVファイルのダウンロード方法についてご教授願います。 (いろんなサイトやFAQをみてきましたが、いまいちわからなかったのでここで質問させていただきます。) 現在、 (1)アンケート項目データ採取.cgi(集計プログラミング込み)…ブラウザ上表示はではcgiにhtmlテンプレートを読み込み ↓ (2)集計.CSVにてデータ集計 ↓ (3)検索.cgiにて(2)集計.CSVのソートや詳細の検索ができる ---------- 他、(4)修正phpがあり、(2)集計.cgiを集計できます。 ---------- (1)、(3)、(4)各ページで<a href="***/***/集計.csv">_CSVダウンロード_</a>なるものをリンク表記したのですが、ダウンロードできません。 どうしたらよいでしょうか?

    • 締切済み
    • CGI
  • vb.netでCSVファイルを変換して新しいCSVファイルを作りたいの

    vb.netでCSVファイルを変換して新しいCSVファイルを作りたいのですが、どのようにすれば良いかヒントを教えていただけないでしょうか? A組,10代,10 A組,20代,20 A組,30代,30 B組,10代,40 B組,20代,50 B組,30代,60 C組,10代,70 C組,30代,80 この様なCSVファイルを変換して ,A組,B組,C組 10代,10,40,70 20代,20,50, 30代,30,60,80 という表のようなCSVファイルを作りたいのです。 データベースなどに入れずに、ファイルtoファイルでの変換がしたいです。 最初のファイルの1列目と2列目の項目をそれぞれ配列に入れて重複をなくす位までは思いつくのですが、そこから先がどの様にすれば良いかよく分かりません。 ヒントだけでも良いのでよろしくお願いいたします。

  • csvファイルのデータ変換について

    OS:windows2000pro VB:VB6.0sp5 c:\data.csv(カンマ区切) のデータ(全6列)で 1列目,2列目,3列目,4列目,5列目,6列目 [変換前(全6列)] abc,a1,aあ b2,3c,4d5e (1行目) ccc,c3,aあ い,3c,4d5e (2行目) bbc,b2,あ b2a,c3,d5e4 (3行目) [変換後(全6列)] abc,a1,"aあ b2",3c,"4d5e" (1行目) ccc,c3,"aあ い",3c,"4d5e" (2行目) bbc,b2,"あ b2a",c3,"d5e4" (3行目) 上記の様に 3列,6列目を「"・・・"」ダブルコーテイションで 囲い(変換し)、c:\data_after.csvというファイル名で 保存する為のプログラムをご教示ください よろしくお願いいたします

  • エクセルファイルの計算の処理について

    エクセルファイルの計算の処理について質問です。よろしくお願いします。 例えば、9000行ほどあるファイルなのですが、2行目と3行目のB列、C列、D列のセルの中身を足して2で割る(平均をとる)計算をし、3行目のA列のセルの中身をそのままにするという処理をし、次に4行目と5行目で処理をするということを最後まで行うことは可能でしょうか? 元のファイルの内容 (行)(列) A B C D  1  2   あ 5 5 5  3   い 3 3 3  4   う 2 2 2  5   え 4 4 4 ...   ↓↓↓↓↓ 処理後のファイルの内容 (行)(列) A B C D  1  2   い 4 4 4  3   え 3 3 3 ... わかりやすい方法があれば教えてください。もし、プログラミングが必要なら、JavaやC言語なら少しだけ知識があります。 ちなみに、ソフトはWindows ExcelではなくOpenOffice3.1を使うことが多いです。 わかりにくい文章で申し訳ありませんがよろしくお願いします。

  • CSVファイルの読み書きについて

    みなさん、こんにちわ。 AというファイルからVBAを使ってデーターをCSV形式で書きだして、Bというファイルでその書き出したCSV形式のファイルを読み込んで、とある表を作成しています。 Bというファイルでの処理を外部に委託した時に、Aから書き出したCSV形式のファイルには、すべてのデーターが表示されていますので出来るなら見れないようにしたいと考えています。 Bファイルでの処理はあくまでも書き出したCSV形式のファイルを読み込むだけで、そのCSVファイルを見れないようにすることは出来ないのでしょうか? 暗号化・パスワード化はたまた別の方法どちらでもいいのですが、CSVファイルの中身がわからないようにし読み込みは今まで通りできればありがたいです。 勉強不足で誠に申し訳ないですが、どういった方法があるのか、どうすればいいのか教えて頂ければ有難いです。 よろしくお願いします。

  • CSVファイルを更新する処理

    CSVに追加や削除、一覧表示、更新をする処理を書いたのですが 更新処理だけうまくいかずに躓いています。 readメソッドのreturn $files;のところで下記の syntax error, unexpected '$files' (T_VARIABLE)というエラーが出てしまいます。 なぜエラーが出ているか教えていただけるとありがたいです。 <?PHP function con($hantei, $num, $name, $age, $address){ $data = [ $num, $name, $age, $address ]; $datas = [$data]; // 追加 if($hantei === 'add'){ $fp = fopen('data.csv', 'a'); foreach($datas as $data) { $line = implode(',' , $data); fwrite($fp, $line . "\n"); } fclose($fp); //更新 } elseif ($hantei === 'update') { function read() { $FILENAME = 'data.csv'; $file = fopen($FILENAME, 'r'); while($data = fgetcsv($file)) { $files[] = $data; }   fclose($file);   return $files; } function replace($num, $name, $age, $address) { // read() $files = read(); $arr = array(); foreach($files as $key => $el) { // [0][a, b, c, d] // [1][a, b, c, d] if ($el[0] == $num) { // $arr[0][0] = $num ... $arr[$key] = array($num, $name, $age, $address); } else { $arr[$key] = array($el[0], $el[1], $el[2], $el[3]); } }    return $arr; } replace(); function write($arr){   $FILENAME = 'data.csv'; $file = fopen($FILENAME, 'w');   foreach ($arr as $v) {    fputcsv($file,$v); }    fclose($file); } $arr = replace($num, $name, $age, $address); write($arr); //削除 } elseif ($hantei === 'dalete') { $file = file('data.csv'); unset($file[$num]); file_put_contents('data.csv', $file); //一覧表示 } elseif ($hantei === 'list') { $fp = fopen('data.csv', 'r'); $readed = fread($fp, filesize('data.csv')); print_r($readed); fclose($fp); } } con('update', 1, 'name', 3, 'address');

    • 締切済み
    • PHP

専門家に質問してみよう