🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

14650閲覧

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

uuu_

総合スコア5

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

1クリップ

投稿2019/12/30 15:10

編集2019/12/30 16:41

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

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

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

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

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

java

1import java.io.BufferedReader; 2import java.io.BufferedWriter; 3import java.io.File; 4import java.io.FileNotFoundException; 5import java.io.FileOutputStream; 6import java.io.FileReader; 7import java.io.IOException; 8import java.io.OutputStreamWriter; 9import java.io.PrintWriter; 10import java.util.Scanner; 11 12public class aaa { 13 14 public static void main(String[] args) { 15 16 double[][] Data; 17 double[][] kekkaData; 18 String line; 19 int a = 0; 20 int b = 0; 21 int N = 0; 22 int h = 0; 23 int tate = 2443;//csvの列数 24 int yoko = 2334;//csvの行数 25        int hosii = 40;//取ってきたい行数の合計 26 27 // データ格納 28 try { 29 File infile = new File("D:\Book3.csv"); 30 BufferedReader br = new BufferedReader(new FileReader(infile)); 31 32 while ((line = br.readLine()) != null) { 33 N++; 34 } 35 br.close(); 36 } catch (FileNotFoundException e) { 37 System.out.println(e); 38 } catch (IOException e) { 39 System.out.println(e); 40 } 41 Data = new double[tate][yoko]; 42 kekkaData = new double[hosii][yoko]; 43 44 45 try { 46 File infile = new File("D:\Book3.csv"); 47 BufferedReader br2 = new BufferedReader(new FileReader(infile)); 48 File outfile = new File("D:\normdist_結果3.csv"); 49 PrintWriter bw = new PrintWriter( 50 new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outfile), "Shift-JIS"))); 51 while ((line = br2.readLine()) != null) { 52 for (b = 0; b < yoko; b++) { 53 String str[] = line.split(",", 0); 54 Data[a][b] = Double.valueOf(str[b]); 55 56 } 57 a++; 58 } 59 br2.close(); 60 61 62 63//追加ここから 64       Scanner scanner=new Scanner(System.in); 65 int v = scanner.nextInt(); 66 System.out.println("抜き出したい行数は?"+v); 67 68 for (int i = 1; i < tate+1; i++) { 69 if( v == i){ 70 for (int j = 0; j < 1; j++) { 71 System.out.println(kekkaData[i][j] + " , "); 72 bw.write((kekkaData[i][j]) + ","); 73 } 74 System.out.println(); 75 bw.write("\r\n"); 76 77 } 78 } 79 80 bw.close(); 81 } catch (FileNotFoundException e) { 82 System.out.println(e); 83 } catch (IOException e) { 84 System.out.println(e); 85 } 86 } 87}

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2019/12/30 15:38

コードのご提示には専用の書き方が用意されています. 入力枠の上辺にある <code> を押すと出てくる ``` で囲まれた「コード」という文字列を置き換える形で, コードを書き込み(コピペ)してください. ご質問は編集できます. 入力枠の下にはプレビューも表示されますので, 確認しながら修正してみて頂けますか.
uuu_

2019/12/30 15:47

教えて頂きありがとうございます。書き方を変更いたしました。 もしよろしければ、このJavaについてのご回答を頂けると嬉しいです。お願い致します。
jimbe

2019/12/30 15:48

> 2 5 と入力したら 入力部分がありません. これも作ってくれということでしょうか. > int tate = 2443;//csvの列数 > int yoko = 2334;//csvの行数 行・列数を固定にしていますが, コード内には行数を数えている個所もあります. 行数は固定でしょうか可変でしょうか.
jimbe

2019/12/30 16:08

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

2019/12/30 16:44

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

2019/12/30 16:54

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

回答1

0

ベストアンサー

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

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

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

java

1import java.io.BufferedReader; 2import java.io.FileReader; 3import java.io.FileWriter; 4import java.io.IOException; 5import java.io.PrintWriter; 6import java.util.Arrays; 7import java.util.List; 8 9public class aaa { 10 public static void main(String[] args) { 11 String inFilename = "D:\Book3.csv"; 12 String outFilename = "D:\normdist_結果3.csv"; 13 14 List<String> nums = Arrays.asList(args); 15 try(BufferedReader br = new BufferedReader(new FileReader(inFilename)); 16 PrintWriter pw = new PrintWriter(new FileWriter(outFilename));) { 17 String line; 18 for(int i=1; (line=br.readLine()) != null; i++) { 19 if(nums.contains(""+i)) pw.println(line); 20 } 21 } catch(IOException e) { 22 e.printStackTrace(); 23 System.exit(1); 24 } 25 } 26}

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

java

1import java.io.BufferedReader; 2import java.io.FileReader; 3import java.io.FileWriter; 4import java.io.IOException; 5import java.io.PrintWriter; 6import java.util.ArrayList; 7import java.util.List; 8import java.util.Scanner; 9 10public class aaa { 11 public static void main(String[] args) { 12 String inFilename = "D:\Book3.csv"; 13 String outFilename = "D:\normdist_結果3.csv"; 14 15 //入力 16 List<Integer> nums = new ArrayList<>(); 17 try(Scanner scanner = new Scanner(System.in);) { 18 int v; 19 while(true) { 20 System.out.print("抜き出したい行は?(1以上を指定, 0以下で終了) :"); 21 v = scanner.nextInt(); 22 if(v <= 0) break; 23 nums.add(v); 24 } 25 } 26 if(nums.size() == 0) { 27 System.out.print("抜き出しませんでした."); 28 System.exit(0); 29 } 30 31 //抽出 32 try(BufferedReader br = new BufferedReader(new FileReader(inFilename)); 33 PrintWriter pw = new PrintWriter(new FileWriter(outFilename));) { 34 String line; 35 for(int i=1; (line=br.readLine()) != null; i++) { 36 if(nums.contains(i)) { 37 System.out.println(line); 38 pw.println(line); 39 } 40 } 41 System.out.print("抜き出しました."); 42 } catch(IOException e) { 43 e.printStackTrace(); 44 System.exit(1); 45 } 46 } 47}

投稿2019/12/30 16:38

編集2019/12/31 11:15
jimbe

総合スコア13202

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

uuu_

2019/12/31 08:55

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問