Java:从CSV文件中搜索字符串数组

时间:2016-10-09 17:15:11

标签: java arrays csv file-io

我是Java新手所以请耐心等待。

我需要再次为我的一项任务提供帮助。现在它涉及FileI / O.

我必须完成的任务是:

我必须阅读.csv文件。文件中的值为:

Christopher Lee,54.0
Stanley Wright,90.5
Oliver Stewart,75.8
Jessica Chang,34.65

正如任务所说,我必须将文件中的内容存储到两个数组中。一个用于名称,一个用于测试标记。我应该至少读取文件两次,一次检查文件中有多少名称,再多几次实际读取文件(获取名称和标记)。所以基本上,我应该有一个数组来存储名称作为字符串,以及一个数组来存储学生的标记作为实数。

我应该排列数组(例如学生[0]应该存储第一个学生的名字,而标记[0]应该存储第一个学生的标记

将.csv文件的内容存储到数组后,我必须向用户显示以下菜单。如果用户按下1,则应提示用户输入学生的姓名。如果用户按下2,程序应该退出。如果名称存在,则应显示输入的学生的测试标记。如果学生不存在,那么我必须向用户输出一条信息,但程序不应该结束,而是返回上面的菜单。

到目前为止,这是我的代码:

public static void main(String[] args) 
{
    Scanner sc = new Scanner(System.in);
    String fileName = "file:///Documents/Java/marks_file.csv"; // Opens the file
    String[] arrayString = new String[6]; // String length inside the file
    int numLines, selection = 0;
    double[] arrayReal = new double[6]; // Number length inside the file
    numLines = getNumLines(fileName); // Gets the length of the file
    readFile(arrayString, arrayReal, fileName);

    // Selection menu
    do 
    {
        System.out.println("Select an option:");
        System.out.println("1. Display mark");
        System.out.println("2. Exit");
        selection = sc.nextInt();

        if (selection == 1) 
        {
            System.out.println("Enter your full name");
            {
                // Do something
            }

        } 
        else if (selection == 2) 
        {
            System.out.println("Goodbye");
        }

    } 
    while (selection == 1);
    //System.out.println("Number of arrays: " + numLines);
}

// Method to get the length of the .csv file
public static int getNumLines(String fileName) 
{
    FileInputStream fileStrm = null;
    InputStreamReader rdr;
    BufferedReader bufRdr;
    String line;
    int lineNum = 0;
    try 
    {
        fileStrm = new FileInputStream(fileName);
        rdr = new InputStreamReader(fileStrm);
        bufRdr = new BufferedReader(rdr);
        line = bufRdr.readLine();

        while (line != null) 
        {
            lineNum = lineNum + 1;
            line = bufRdr.readLine();
        }
        fileStrm.close();
    } 
    catch (IOException e) 
    {
        try 
        {
            if (fileStrm != null) 
            {
                fileStrm.close();
            }
        } 
        catch (IOException ex2) 
        {
            // Nothing to do
        }
        System.out.println("Error in file processing: " + e.getMessage());
    }

    return lineNum;
}
// Method to store the values to arrays
public static void readFile(String[] arrayString, double[] arrayReal, String fileName) 
{
    Scanner sc = new Scanner(System.in);
    FileInputStream fileStrm = null;
    InputStreamReader rdr;
    BufferedReader bufRdr;
    String line;

    try 
    {
        fileStrm = new FileInputStream(fileName);
        rdr = new InputStreamReader(fileStrm);
        bufRdr = new BufferedReader(rdr);

        for (int i = 0; i < arrayString.length; i++) 
        {
            line = bufRdr.readLine();
            arrayString[i] = processString(line);
            arrayReal[i] = processReal(line);
        }

    } 
    catch (IOException e) 
    {
        try 
        {
            if (fileStrm != null) 
            {
                fileStrm.close();
            }
        } 
        catch (IOException ex2) 
        {
            // Nothing to do
        }
        System.out.println("Error in file processing: " + e.getMessage());
    }
}
// Stores the String lines to array
public static String processString(String line) 
{
    String string;
    String[] lineArray = line.split(",");
    return string = lineArray[0];
}

// Stores real number lines to array
public static double processReal(String line) 
{
    double real;
    String[] lineArray = line.split(",");
    return real = Double.parseDouble(lineArray[1]);
}

到目前为止,我完成了#34;阅读文件&#34;部分并将.csv文件中的内容处理为数组。

我不太确定如何提示用户从.csv文件中搜索字符串数组。我试着查看其他来源,即使在这个网站上,但我根本没有运气。我尝试了Scanner.next()方法,但这根本不起作用。也许我只是错过了什么。另外,我不确定我是否做了两次&#34;读取文件&#34;对。

我是否在正确的轨道上?我需要一些指导

3 个答案:

答案 0 :(得分:0)

我宁愿告诉您将数据传递给通用的arraylist,然后使用get()方法查询结果,而不是存储到数组中。

答案 1 :(得分:0)

你使事情变得简单。

只需使用名称作为键的HashMap和测试得分作为值。

  1. 您打开文件
  2. 您阅读每一行并将每一行翻译为哈希地图条目
  3. 当文本输入到控制台时,您只需从哈希映射中获取它,如果存在则返回该值,如果不是则返回到数字3

答案 2 :(得分:0)

首先,我想说我会使用Map而不是两个数组,但我会向您展示使用两个数组的解决方案。

你接近解决方案。你遇到的一个问题是 scanner.next()只读取输入直到第一个空格。这就是你需要使用 scanner.nextLine()的原因。此方法读取完整的行。代码可能看起来像这样:

具有两个数组的解决方案

Scanner sc = new Scanner(System.in);
System.out.print("Please enter name of student: ");
String name = sc.nextLine();

for(int i = 0; i < arrayString.length; i++){
    if(name.equals(arrayString[i])) {
        System.out.println(arrayReal[i]);
    }
}

使用HashMap的解决方案

  1. 初始化HashMap

    HashMap<String, Double> hm = new HashMap<String, Double>();

  2. 填写HashMap

    hm.put("Christopher Lee", 54.0);

  3. 打印学生的双倍值

    System.out.print("Please enter name of student: "); String name = sc.nextLine(); System.out.println(hm.get(name));