从CSV文件中读取数据,比较并以Java格式显示

时间:2014-06-13 08:44:28

标签: java csv

我有3个csv文件,如下所示:

  • 包含列的作者文件:emailID |名字|姓氏
  • 包含列的书籍文件:title | isbn | author_email |说明
  • 杂志与文件列:标题| isbn | author_email |发布

我需要显示:

  1. 基于ISBN 显示所有书籍和杂志
  2. 所有书籍和杂志作者
  3. 所有书籍和杂志按标题
  4. 我现在正在使用BufferedReader

    String csvFileToRead = "csvFiles/authors.csv";    
      BufferedReader br = null;    
      String line = "";    
      String splitBy = ";";    
    try {    
    
      br = new BufferedReader(new FileReader(csvFileToRead));    
      while ((line = br.readLine()) != null) {    
    
        String[] book = line.split(splitBy);    
        System.out.println("BOOKS [Email Address= " + book[0] + " , firstname="    
                              + book[1] + " , lastname=" + book[2] + "]");  
    
      }
    }
    

    我对如何处理多个文件感到困惑。以下是我考虑过的方法:

    1. 更改

      String csvFileToRead 
      

      到String数组

      String[] csvFileToRead = {"data/authors.csv", "data/books.csv", "data/magazines.csv"}; 
      

      然后每次将每个索引传递给返回所有行的方法,但是要使用DS卡住。我认为ArrayList是不够的,因为我需要分开的数据。

      • 我应该使用2D阵列吗?
      • 我是否需要在DS中读取和存储数据才能实现目标?
    2. 我应该为作者,书籍和杂志制作3个不同的课程吗?

    3. 这样做的理想方法是什么?请建议。

3 个答案:

答案 0 :(得分:1)

我会创建3个List<String[]>,每个public List<string[]> csvToList(String csvFileToRead){ BufferedReader br = null; String line = ""; String splitBy = ";"; try { br = new BufferedReader(new FileReader(csvFileToRead)); List<string[]> list_csv = new ArrayList<string[]>(); while ((line = br.readLine()) != null) { String[] book = line.split(splitBy); authors.add(book); } catch(Exception ex) {} return list_csv; } 包含一个CSV文件中的矩阵,方法如下:

List<String[]> authors = csvToList("csvFiles/authors.csv");
List<String[]> books = csvToList("csvFiles/books.csv");
List<String[]> magazine = csvToList("csvFiles/magazine.csv");

之后你可以用它作为:

public void printISBN(string ISBN){
     for(String[] s_tab in books)
        if(s_tab[1].equals(ISBN)) 
           System.out.println(s_tab[0]);
     for(String[] s_tab in magazine)
        if(s_tab[1].equals(ISBN)) 
           System.out.println(s_tab[0]);
}

您现在可以打印所需的所有内容,例如第一种情况:基于ISBN显示所有书籍和杂志

List<Authors> List<Books> List<Magazine>

希望我帮助过。

修改

您还可以为每个文件创建3个类,并对类别列表执行相同的操作:{{1}}但如果您只需回答这3个问题则没有必要。

答案 1 :(得分:1)

一个简单的解决方案是创建与您的实体相对应的三个类:

public class Author {
    private String email;
    private String firstName;
    private String lastName;

    // ...
}

public class Book {
    private String title;
    private String isbn;
    private String authorEmail;
    private String description;

    // ...
}

public class Magazine {
    private String title;
    private String isbn;
    private String authorEmail;
    private Date releaseDate;

    // ...
}

在您的主要代码中,当您阅读CSV文件时,您可以填写HashMap将ISBN映射到书籍,以及类似的杂志,您可以使用它来检索ISBN中的书籍或杂志:

Map<String, Book> isbnBookMap = new HashMap<String, Book>();
Book book = isbnBookMap.get(isbn);

Map<String, Magazime> isbnMagazineMap = new HashMap<String, Magazime>();
Magazime magazine = isbnMagazineMap.get(isbn);

同样以书名形式获得书籍或杂志。

至于通过作者获取书籍,您需要将作者邮件地址映射到List书籍,因为作者可以拥有多本书:

Map<String, List<Book>> authorBookMap = new HashMap<String, List<Book>>();
List<Book> books = authorBookMap.get(authorAddress);

答案 2 :(得分:0)

您可以使用Java CSV API 比如OpenCSV