質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.03%

javaで指定の行を取り出したい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,138

score 5

初めて質問するので、書き方が違いましたらすみません…

javaで指定の行を取り出したいです。

今できているところは
•csvファイルをJavaに読み込む
•csvファイルの中身は全て数値で、それらを配列に入れ込んだ
•結果をcsvファイルに出力する準備はできている

までで問題の中身なのですが、やりたいこととしては、
自分がコマンドで入力する数字と同じ行を持ってきてcsvファイルに入れ込みたいです。
(2 5 と入力したら2行目と5行目を取り出したいです。)

今書き終わっているところまでを貼ります。
教えて頂けないでしょうか?お願い致します。

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.Scanner;

public class aaa {

    public static void main(String[] args) {

        double[][] Data;
        double[][] kekkaData;
        String line;
        int a = 0;
        int b = 0;
        int N = 0;
        int h = 0;
        int tate = 2443;//csvの列数
        int yoko = 2334;//csvの行数
          int hosii = 40;//取ってきたい行数の合計

        // データ格納
        try {
            File infile = new File("D:\\Book3.csv");
            BufferedReader br = new BufferedReader(new FileReader(infile));

            while ((line = br.readLine()) != null) {
                N++;
            }
            br.close();
        } catch (FileNotFoundException e) {
            System.out.println(e);
        } catch (IOException e) {
            System.out.println(e);
        }
        Data = new double[tate][yoko];
        kekkaData = new double[hosii][yoko];


        try {
            File infile = new File("D:\\Book3.csv");
            BufferedReader br2 = new BufferedReader(new FileReader(infile));
            File outfile = new File("D:\\normdist_結果3.csv");
            PrintWriter bw = new PrintWriter(
                    new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outfile), "Shift-JIS")));
            while ((line = br2.readLine()) != null) {
                for (b = 0; b < yoko; b++) {
                    String str[] = line.split(",", 0);
                    Data[a][b] = Double.valueOf(str[b]);

                }
                a++;
            }
            br2.close();



//追加ここから
       Scanner scanner=new Scanner(System.in);
            int v = scanner.nextInt();
            System.out.println("抜き出したい行数は?"+v);

            for (int i = 1; i < tate+1; i++) {
                if( v == i){
                for (int j = 0; j < 1; j++) {
                    System.out.println(kekkaData[i][j] + " , ");
                    bw.write((kekkaData[i][j]) + ",");
                }
                System.out.println();
                bw.write("\r\n");

            }
            }

            bw.close();
        } catch (FileNotFoundException e) {
            System.out.println(e);
        } catch (IOException e) {
            System.out.println(e);
        }
    }
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • jimbe

    2019/12/31 01:08

    すいません, コマンドで入力するということは args のことでしょうか.

    キャンセル

  • uuu_

    2019/12/31 01:44

    行数は固定です。
    コマンドに入力するという表記で合っているのかが分からないのですが、「抜き出したい行数は?」と聞いて


    と入力すると2、5行目が抜き出せるようにしたいです。お願いします。
    今、追加でimport java.util.Scanner;と
    Scanner scanner=new Scanner(System.in);
    int v = scanner.nextInt();
    System.out.println("抜き出したい行数は?"+v);を入れてみました。このvと同じ行数を抜き出すようにしたいのですが、このままではうまくいかないのでご教授願います。お願い致します。

    キャンセル

  • jimbe

    2019/12/31 01:54

    指定は行数では無く行番号ということでよろしいですか.
    追加されたコードでは 2 と 5 の二つを入力できませんし, 複数の数値を指定するのならば入力の終わりも指示しなくては, いつまでも指定し続けることになります. その辺りは如何でしょうか.

    キャンセル

回答 1

checkベストアンサー

0

まず問題を考えてみましょう.
CSV として大量の数値が入っているファイルから, 指定した行を別ファイルに取り出します.
その為にご提示のコードでは CSV を解析して数値を一つ一つ取り出し, 配列に格納しています.

しかし必要なのは「行を取り出すこと」であり, "行"という構造があるテキストファイルでさえあれば, 内容が何であるかはプログラム的には考える必要はありません.
さらには, 行の指定が行番号であれば, 行を読む毎にそれが指定された行番号かを判断していけば, あらかじめ CSV 全体を読んでおく必要さえありません.

そこから考えると以下のようなコードが出来ます.

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.List;

public class aaa {
  public static void main(String[] args) {
    String inFilename = "D:\\Book3.csv";
    String outFilename = "D:\\normdist_結果3.csv";

    List<String> nums = Arrays.asList(args);
    try(BufferedReader br = new BufferedReader(new FileReader(inFilename));
        PrintWriter pw = new PrintWriter(new FileWriter(outFilename));) {
      String line;
      for(int i=1; (line=br.readLine()) != null; i++) {
        if(nums.contains(""+i)) pw.println(line);
      }
    } catch(IOException e) {
      e.printStackTrace();
      System.exit(1);
    }
  }
}

追加
行を一つずつ指定する場合です.

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class aaa {
  public static void main(String[] args) {
    String inFilename = "D:\\Book3.csv";
    String outFilename = "D:\\normdist_結果3.csv";

    //入力
    List<Integer> nums = new ArrayList<>();
    try(Scanner scanner = new Scanner(System.in);) {
      int v;
      while(true) {
        System.out.print("抜き出したい行は?(1以上を指定, 0以下で終了) :");
        v = scanner.nextInt();
        if(v <= 0) break;
        nums.add(v);
      }
    }
    if(nums.size() == 0) {
      System.out.print("抜き出しませんでした.");
      System.exit(0);
    }

    //抽出
    try(BufferedReader br = new BufferedReader(new FileReader(inFilename));
        PrintWriter pw = new PrintWriter(new FileWriter(outFilename));) {
      String line;
      for(int i=1; (line=br.readLine()) != null; i++) {
        if(nums.contains(i)) {
          System.out.println(line);
          pw.println(line);
        }
      }
      System.out.print("抜き出しました.");
    } catch(IOException e) {
      e.printStackTrace();
      System.exit(1);
    }
  }
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/12/31 17:55

    ありがとうございます( i _ i )
    取り出すことができました。大変助かりました。ありがとうございました!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.03%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る