emily-08
@emily-08 (えみり)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

特定の文字列を含むデータを表示したい。(CSVファイル)

解決したいこと

プログラムで入力文字列を受け取り、この文字列を「名前」に含む人のデータを表示させたいです。
ご教授いただけますと幸いです。

プログラムの詳細
CSVファイルのデータを表示するプログラムを作っています。
データには名前、住所、電話番号、年齢の4項目を持っています。

下記1〜3の機能があります。Mainクラスにて1~3のいずれかの整数を入力すれば、機能が実装できるようにしています。
1,CSVファイルのデータ全て表示する。
2,CSVファイルのデータから名前に検索文字列を含むデータのみを表示する。
3,プログラムを終了する。

CSVの中身を全て表示する機能(1番)で使用している、
DisplayProcessクラスのdataLoadStoreメソッドを使いまわして、検索機能(2番)も記述したいのですが、上手くいきませんでした。

※載せているソースは、1と2の機能同じになっています。

該当するソースコード

Main.java
package qiita;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.List;
import java.util.Scanner;

public class Main {
	static int input;
	static Scanner scanner;
	static Scanner scan;

	public static void main(String[] args) throws IOException {

		//「1(表示)」又は「2(検索)」機能を選択した場合、各機能の実行終了後にメニュー画面を繰り返し表示
		while (input != 3) {
			//menuメソッドの呼び出し
			input = menu();
			DisplayProcess DisplayProcess = new DisplayProcess();

			//各機能の処理
			if (input == 1) {
				//「1(表示)」機能。CSVのデータをすべて表示。

				System.out.println("1,表示");

				try {
					//dataLoadStoreメソッドの呼び出し
					List<Store> list = DisplayProcess.dataLoadStore();
					//displayメソッドの呼び出し
					DisplayProcess.display(list);
				} catch (FileNotFoundException e) {
					System.out.println(e);
				}
			} else if (input == 2) {
				//「2(検索)」機能。CSVファイルのデータから検索文字列を含むデータのみを表示する。

				System.out.println("2,検索");

				//標準入力受付用オブジェクト
				System.out.println("検索文字列を入力してください…");
				scan = new Scanner(System.in);//インスタンス生成
				String strSearch = scan.next();

				try {
					//dataLoadStoreメソッドの呼び出し
					List<Store> list = DisplayProcess.dataLoadStore();
					//searchメソッドの呼び出し
					Search.display(list, strSearch);
				} catch (FileNotFoundException i) {
					i.printStackTrace();
					return;
				}
			}
		}
		scanner.close();//
		scan.close();//
		//「3,終了」機能。プログラムの終了。
		System.out.println("3,終了");
		System.out.println("プログラムを終了します…");
	}

	public static int menu() {

		int input;

		//メニュー一覧
		System.out.println();
		System.out.println("************メニュー一覧************");
		System.out.println(" 1,表示      2,検索      3,終了");
		System.out.println("************************************");

		//標準入力受付用オブジェクト
		System.out.println("1,2,3いずれかの数字を半角で入力してください…");
		scanner = new Scanner(System.in);
		input = scanner.nextInt();

		//入力値チェック
		if (!(input == 1 || input == 2 || input == 3)) {
			System.out.println("半角数字1~3以外の文字/数字が入力されています。もう一度やり直して下さい…");
			//入力値が「1〜3」以外の場合、メニュー画面を繰り返す
			menu();
		}

		//入力値が「1〜3」の場合の処理
		return input;
	}
}
DisplayProcess.java
package qiita;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;

public class DisplayProcess {

	// CSVファイルのパス
	public static final Path PATH = Paths.get("./employee.csv");

	List<Store> dataLoadStore() throws IOException {

		// 読み込んだCSVファイルの情報を格納するリスト
		List<String> csvList = new ArrayList<>();

		csvList = Files.readAllLines(PATH);

		ArrayList<Store> list = new ArrayList<>();

		//CSVファイルの情報を格納したリスト分繰り返し
		for (String rows : csvList) {

			//カンマ区切りの配列を作成
			String[] rowArray = rows.split(",");

			//インスタンス生成
			Store bean = new Store();

			//Storeにデータを入れる
			bean.setName(rowArray[0]);
			bean.setAddress(rowArray[1]);
			bean.setTel(rowArray[2]);
			bean.setAge(rowArray[3]);
			list.add(bean);
		}
		return list;
	}

	void display(List<Store> list) {

		// Storeのデータを取り出して表示
		for (Store b : list) {
			System.out.println("[" + b.getName() + "][" + b.getAddress() + "][" + b.getTel() + "][" + b.getAge() + "]");
		}
	}
}
Store.java
package qiita;

public class Store {

	//名前
	private String name;
	//住所
	private String address;
	//電話番号
	private String tel;
	//年齢
	private String age;

	/**
	 * getNameメソッド
	 * 名前を取得
	 * @return name 名前
	 */
	public String getName() {
		return name;
	}
	/**
	 * setNameメソッド
	 * 名前を設定
	 * @param name 名前
	 */
	public void setName(String name) {
		this.name = name;
	}

	/**
	 * getAddressメソッド
	 * 住所を取得
	 * @return address 住所
	 */
	public String getAddress() {
		return address;
	}
	/**
	 * setAddressメソッド
	 * 住所を設定
	 * @param address 住所
	 */
	public void setAddress(String address) {
		this.address = address;
	}

	/**
	 * getTelメソッド
	 * 電話番号を取得
	 * @return tel 電話番号
	 */
	public String getTel() {
		return tel;
	}
	/**
	 * setTelメソッド
	 * 電話番号を設定
	 * @param tel 電話番号
	 */
	public void setTel(String tel) {
		this.tel = tel;
	}

	/**
	 * getAgeメソッド
	 * 年齢を取得
	 * @return age 年齢
	 */
	public String getAge() {
		return age;
	}
	/**
	 * setAgeメソッド
	 * 年齢を設定
	 * @param age 年齢
	 */
	public void setAge(String age) {
		this.age = age;
	}
}
Search.java
package qiita;

import java.util.List;

public class Search {

	public static void display(List<Store> list, String searchWord) {

		// Storeのデータを取り出して表示
		for (Store b : list) {
			System.out.println("[" + b.getName() + "][" + b.getAddress() + "][" + b.getTel() + "][" + b.getAge() + "]");
		}
	}
}
employee.csv
名前, 住所 ,  電話番号  ,年齢,
中田,東京都,00-3333-3333,25,
長友,東京都,00-2222-2222,25,
森保,東京都,03-1234-5678,25,
川島,福島県,00-1111-1111,30,
吉田,福島県,00-0000-0000,30,
中村,福島県,00-9999-9999,30,
三浦,栃木県,99-9999-9999,40,
久保,栃木県,00-9999-9990,40,
三苫,石川県,99-9999-9999,40,
長谷部,長野県,00-9999-0000,40
0

1Answer

Search.display()ですが、引数のsearchWordを使っておらず、全部表示しているだけです。この所為では?
それとも、ここで『検索の書き方が分からない』ということでしょうか?

0Like

Comments

  1. 部分一致で検索する例です。

    Search.java:display()
    	public static void display(List<Store> list, String searchWord) {
    		// Storeのデータを取り出して、部分一致するものを表示
    		for (Store b : list) {
    			if (b.getName().indexOf(searchWord) != -1) {
    				System.out.println("[" + b.getName() + "][" + b.getAddress() + "][" + b.getTel() + "][" + b.getAge() + "]");
    			}
    		}
    	}
    
  2. @emily-08

    Questioner

    言葉足らずで失礼しました。
    部分一致の検索がよく分かっておりませんでした。
    ご提示していただいたソースで解決出来ました。
    ありがとうございます。

Your answer might help someone💌