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

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

新規登録して質問してみよう
ただいま回答率
85.51%
Java

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

Q&A

5回答

9026閲覧

csvの抽出条件について質問です

kurageno

総合スコア16

Java

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

0グッド

0クリップ

投稿2015/10/18 10:16

編集2022/01/12 10:55

csvファイルの読み込みにキーボード入力をした文字と一致するものを抽出させるプログラムをつくっています。
ただ読み込むだけならできるのですが、それに条件をつけると読み込めなくなります。
以下のようなソースを作ったのですが、
入力した文字と同じ文字の入った文?をcsvから抽出させるには何が足らず、おかしいのでしょうか?
例えばcsvに 東京支店 TEL000-000-0000
があれば 実行した画面に東京と入力すると
東京支店 TEL000-000-0000 と出したいです。

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;

class Uriage {
public static void main( String[] args ) {
try {
BufferedReader br
= new BufferedReader( new FileReader("c:\date.csv") );
BufferedReader b =
new BufferedReader(new InputStreamReader(System.in));
String date;
System.out.println("氏名を入力してください");
// ファイルを行単位で読む
while( (date = br.readLine()) != null ) {
// カンマで分割したString配列を得る
String siten[] = date.split( "," );
// データ数をチェックしたあと代入、プリントする
String siten = b.readLine();
if(name.equals(br.readLine())){
System.out.println(br);
}

} br.close(); } catch( IOException e ) { System.out.println( "入出力エラーがありました" ); } catch( NumberFormatException e ) { System.out.println( "フォーマットエラーがありました" ); } }

}

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

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

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

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

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

guest

回答5

0

br.readLine()を呼ぶ度にcsvファイルから1行読んでいるためではないですか?
また,検索対象の文字列の取得も1回だけにしなければならないので,while()ループの外に置くべきだと思います.

java

1System.out.println("氏名を入力してください"); 2name = b.readLine(); 3// ファイルを行単位で読む 4while( (date = br.readLine()) != null ) { 5 int i; 6 // カンマで分割したString配列を得る 7 String namae[] = date.split( "," ); 8 // 全要素を探索して一致しない間はiをインクリメント 9 for (i = 0; i < namae.length && namae[i].equals(name) == false; i++); 10 if (i != namae.length) { 11 // ヒットした(要素の中に一致するものがあった) 12 System.out.println(date); 13 } 14}

上のソースコードの解説を少ししますと,
whileループですることはcsvファイルから1行読むこと,
forループですることはその1行の中に検索単語に一致する要素があるか調べること,です.
Javaにはcsvをもう少し効率よく管理できるように,StringTokenizerというクラスが存在します.
JavaでCSV形式のファイルを読み書きする
こちらの方法も参考にしてみてください.

投稿2015/10/18 10:52

KenTerada

総合スコア751

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

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

kurageno

2015/10/18 13:06

回答頂きありがとうございます。 csvについてとループについての理解もまだまだでした。 教えていただいたページでも勉強します。
KenTerada

2015/10/19 07:42 編集

あ,「東京支店」を「東京」で検索するには,equalsメソッドではなく,Stringクラスの部分一致を行うindexOfメソッドを使ってください.
guest

0

入力した文字と同じ文字の入った文をcsvから抽出させるプログラムです

java

1import java.io.BufferedReader; 2import java.io.FileReader; 3import java.io.IOException; 4import java.io.InputStreamReader; 5 6class U { 7 public static void main( String[] args ) { 8 try { 9 BufferedReader br 10 = new BufferedReader( new FileReader("C:\\file\\files\\file.csv") ); 11 BufferedReader b = 12 new BufferedReader(new InputStreamReader(System.in)); 13 String date; 14 System.out.println("氏名を入力してください"); 15 String sie = b.readLine(); 16 // ファイルを行単位で読む 17 while( (date = br.readLine()) != null ) { 18 // カンマで分割したString配列を得る 19 String siten[] = date.split( "," ); 20 // データ数をチェックしたあと代入、プリントする 21 if(date.contains(sie)){ 22 23 for(String e:siten){ 24 System.out.print (e+" "); 25 } 26 break; 27 } 28 29 } 30 br.close(); 31 } catch( IOException e ) { 32 System.out.println( "入出力エラーがありました" ); 33 } catch( NumberFormatException e ) { 34 System.out.println( "フォーマットエラーがありました" ); 35 } 36 } 37}

投稿2016/10/31 19:29

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

CSVファイルフォーマットについて
CSVとはComma Separated Values の頭文字を取ったファイルフォーマットです。
テキストファイルの中に、1行1レコードでカンマを列区切りにしたものです。
ヘッダがある場合と無い場合があります。
拡張子は.csvが主に用いられます。

data.csv(ヘッダ付きの例)

支店名,TEL 本店,000-000-0001 東京支店,000-000-0000 神奈川支店,000-000-0002

似たようなものにタブ区切りテキストファイルもあります。
決まった拡張子は特になく.txtが用いられる様です。


コーディングについて
自分でコーディングする前や、人にプログラムを教えるときに、
私はよくコメントで処理の流れを記載してそれにコードを追記していく方法を用います。

同様のことを下記に記載してみます。
処理の流れとして下記、A・Bの2パターンが考えられますが、今回はパターンAでの記載です。

パターンA:
1. ユーザー入力取得
2.CSVファイルデータ取得&比較

パターンB:
1.CSVファイルデータ取得(変数等にプール)
2.ユーザー入力取得
3.比較

lang

1/* 処理開始 javaではmain()から */ 2 3 /* ユーザーからの入力を受け取り */ 4 5 /* ファイルからデータ取得 */ 6 /* ファイルオープン */ 7 /* 繰り返し(ファイルの行データがある分だけ) */ 8 /* 一行読込 */ 9 /* 行内に入力した文字と同じ文字列があるか確認 */ 10 /* 同じ文字列がある場合 */ 11 /* 見つけた行のデータを表示 */ 12 /* ループを途中脱出 */ 13 14 /* 無い場合 */ 15 /* 処理なし? */ 16 /* 繰り返し終了 */ 17

これに処理を追加したイメージで質問者様のコードを挿入すると以下のようになります。

lang

1import java.io.BufferedReader; 2import java.io.FileReader; 3import java.io.IOException; 4import java.io.InputStreamReader; 5 6class Uriage { 7 /* 処理開始 javaではmain()から */ 8 public static void main( String[] args ) { 9 10 /* ユーザーからの入力を受け取り */ 11 try { 12 System.out.println("支店名を入力してください"); 13 //System.out.println("氏名を入力してください"); 14 15 /* 標準入力受け取り */ 16 BufferedReader b = 17 new BufferedReader(new InputStreamReader(System.in)); 18 /* 繰り返し(ユーザーの入力が行われるまで無限ループで待機) */ 19 String siten; 20 while( (siten = b.readLine()) != null ) { 21 } /* 繰り返し終了 */ 22 } catch (Exception e) { 23 /* 何か入力時にエラーがある場合の例外処理 */ 24 return; 25 } finally { 26 /* 入力ストリームをクローズ 27 クローズを忘れるとストリームを持ちっぱなしになってしまう */ 28 b.close(); 29 } 30 31 /* ファイルからデータ取得 */ 32 try { 33 /* ファイルオープン */ 34 BufferedReader br 35 = new BufferedReader( new FileReader("c:\\date.csv") ); 36 /* 繰り返し(ファイルの行データがある分だけ) */ 37 String date; 38 // ファイルを行単位で読む /* 一行読込 */ 39 while( (date = br.readLine()) != null ) { 40 // カンマで分割したString配列を得る 41 String columns[] = date.split( "," ); // 標準入力の受け取り用変数と同じ名前なので名称変更 42 //String siten[] = date.split( "," ); 43 44 /* 行内に入力した文字と同じ文字列があるか確認 */ 45 if (columns[0].contains(siten)) { 46 /* 同じ文字列がある場合 */ 47 /* 見つけた行のデータを表示 */ 48 System.out.println(data); /* ファイルから読み取った1行がそのまま表示されます。 */ 49 //System.out.println(br); /* br はストリームのため、標準出力できません */ 50 /* ループを途中脱出 */ 51 } else { 52 /* 無い場合 */ 53 /* 処理なし? */ 54 } 55 } /* 繰り返し終了 */ 56 } catch( IOException e ) { 57 System.out.println( "入出力エラーがありました" ); 58 } catch( NumberFormatException e ) { 59 System.out.println( "フォーマットエラーがありました" ); 60 } finally { 61 /* ファイルストリームクローズ */ 62 br.close(); 63 } 64 65 return; 66 } 67}

ユーザー入力部とファイル読み取り部で例外を分けました。

以上、参考になりますでしょうか?

投稿2016/03/06 14:26

Aeona

総合スコア396

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

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

0

部分一致であればequalsメソッドの代わりにcontainsメソッドを使います.
Stringのドキュメントを見れば他にも最初で一致するかを判定するstartsWith,終わりで一致するかを判定するendsWith等,色々な条件,返り値を出すメソッドがそろっています.

投稿2015/10/19 07:14

swordone

総合スコア20649

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

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

0

標準入力の読み込みタイミングがおかしいですね。
それと、splitしたnamaeが使われていません。

さらにJava7以降であれば、下記のような書き方をした方がすっきりします。

lang

1// import java.io.*; 2// import java.util.Scanner; 3 4// 氏名を入力・取得 5System.out.println("氏名を入力してください"); 6@SuppressWarnings("resource") 7Scanner input = new Scanner(System.in); 8String name = input.nextLine(); 9 10// ファイルを開いて、1行ずつ最終行まで読み込む(自動でclose) 11try (Scanner scanner = new Scanner(new File("data.csv"))) { 12 while (scanner.hasNextLine()) { 13 String line = scanner.nextLine(); 14 15 // 読み込んだ行をカンマで分割 16 String[] columns = line.split(","); 17 18 // カンマで分割した結果、最初のカラムが名前と一致している? 19 if (columns.length >= 1 && columns[0].equals(name)) { 20 // 一致していたら、その行を出力 21 System.out.println(line); 22 } 23 } 24} catch (IOException e) { 25 System.out.println("入出力エラーがありました"); 26} catch (NumberFormatException e) { 27 System.out.println("フォーマットエラーがありました"); 28}

投稿2015/10/18 11:15

編集2015/10/18 13:08
argius

総合スコア9388

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

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

kurageno

2015/10/18 13:03

回答と参考ソースを頂き ありがとうございます。 splitしたのに使えていないことに気づけませんでした。 ソースも作り直してみます!
argius

2015/10/19 08:11 編集

swordoneさんの書かれているとおり、部分一致させるには、columns[0].equals(name)をcolumns[0].contains(name)にしてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問