使用csv文件作为输入参数创建getList方法

时间:2015-01-20 19:26:34

标签: java list csv

我的算法类的第一个分配是我必须创建一个程序,从提供的csv文件中读取一系列书名,对它们进行排序,然后将它们打印出来。赋值具有非常具体的参数,其中之一就是我必须创建一个静态List getList(String file)方法。该方法的具体内容如下:

" getList方法应该读取csv中的数据 file book.csv。如果一条线不遵循该模式 标题,作者,年份然后应该写一条消息 到标准错误流(见示例输出) 程序应继续阅读下一行。没有 应抛出异常。"

我对使用List,ArrayList或读取文件没有太多经验,所以你可以猜测这对我来说非常困难。以下是我到目前为止的方法:

public static List<Book> getList(String file)
{
    List<Book> list = new ArrayList<Book>();

    return list;
}

目前,我最好的猜测是使用i作为索引进行for循环并将新的Book对象实例化到List中,但是我不知道设置循环有多高,因为我没有&#39;有任何方法告诉程序,例如,csv中有多行。我也不知道如何让它在csv中区分每本书的标题,作者和年份。

抱歉这个冗长的问题。我很感激任何帮助。感谢。

2 个答案:

答案 0 :(得分:2)

执行此操作的最佳方法是逐行读取文件,并检查行的格式是否正确。如果正确,请将新对象添加到列表中,并在行中显示详细信息,否则请写入错误消息并继续。

您可以使用BufferedReader阅读文件。他们可以通过执行以下操作逐行阅读:

        BufferedReader br = new BufferedReader(new FileReader(file));
        String line;

        while ((line = br.readLine()) != null) {
            // do something with the line here

        }
        br.close();

现在您已拥有这些行,您需要验证它们的格式是否正确。一个简单的方法是在逗号上分割行(因为它是一个csv文件),并检查它在数组中至少有3个元素。您可以使用String.split(regex)方法执行此操作。

String[] bookDetails = line.split(",");

这会使用文件中的字段填充数组。例如,如果第一行是one,two,three,那么数组将是["one","two","three"]

现在您拥有该行的值,但您需要验证它的格式是否正确。由于你的帖子指定它应该有3个字段,我们可以通过检查上面得到的数组的长度来检查这个。如果长度小于3,我们应该输出一些错误消息并跳过该行。

            if(bookDetails.length<3){ //title,author,year
                System.err.println("Some error message here"); // output error msg
                continue; // skip this line as the format is corrupted
            }

最后,因为我们已经阅读并验证了我们需要的信息,并且格式正确。我们可以创建一个新对象并将其添加到列表中。我们将使用Integer中内置的Java包装器将年份解析为int类构造函数的原始Book类型。 Integer有一个函数Integer.parseInt(String s),可以将String解析为int值。

list.add(new Book(bookDetails[0], bookDetails[1], Integer.parseInt(bookDetails[2])));

希望这能帮到你,并回答你的问题。我们所做的完整方法可能如下:

public static List<Book> getList(String file) {
    List<Book> list = new ArrayList<Book>();

    try {
        BufferedReader br = new BufferedReader(new FileReader(file));
        String line;

        while ((line = br.readLine()) != null) {
            String[] bookDetails = line.split(",");
            if (bookDetails.length < 3) { // title,author,year
                System.err.println("Some error message here");
                continue;
            }

            list.add(new Book(bookDetails[0], bookDetails[1], Integer.parseInt(bookDetails[2])));

        }
        br.close();
    } catch (IOException e) {
        e.printStackTrace();
    }

    return list;
}

如果您想对此进行测试,可以使用以下代码进行main方法(这是我测试它的方法)。

public static void main(String[] args) {
    String file = "books.csv";
    List<Book> books = getList(file);
    for(Book b : books){
        System.out.println(b);
    }
}

要测试它,请确保在Java项目的根目录中有一个文件(我的是“books.csv”)。我看起来像:

bob,jones,1993
bob,dillon,1994
bad,format
good,format,1995
another,good,1992
bad,format2
good,good,1997

使用上面的main方法,getList函数和文件,我的代码生成器输出如下(注意:Std.err流的错误消息为红色,SO不显示颜色):

Some error message here
Some error message here
[title=bob, author=jones, years=1993]
[title=bob, author=dillon, years=1994]
[title=good, author=format, years=1995]
[title=another, author=good, years=1992]
[title=good, author=good, years=1997]

如果您对其中的任何部分感到困惑,请随时提出问题。显示的输出来自我在toString()类上编写的Book方法,我用它来测试代码中的代码。

答案 1 :(得分:0)

您可以使用do while循环并将其读取到文件末尾。每个新行都代表一个Book Object详细信息。 在csv中,所有细节都以逗号分隔,因此您可以读取字符串,每个逗号将充当Book属性之间的分隔符。