【问题标题】:Read data from a CSV file, compare and display in Java从 CSV 文件中读取数据,比较并在 Java 中显示
【发布时间】:2014-06-13 08:44:27
【问题描述】:

我有 3 个 csv 文件如下:

  • 作者文件的列:emailID |名字 |姓氏
  • 包含列的书籍文件:标题 |伊斯本 |作者_电子邮件 |说明
  • 带有文件列的杂志:标题 |伊斯本 |作者_电子邮件 |发布日期

我需要展示:

  1. 基于 ISBN 显示所有书籍和杂志
  2. 作者的所有书籍和杂志
  3. 所有书籍和杂志按标题

我现在使用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[] csvFileToRead = {"data/authors.csv", "data/books.csv", "data/magazines.csv"}; 
    

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

    • 我应该使用二维数组吗?
    • 是否需要在 DS 中读取和存储数据才能实现目标?
  2. 我应该为作者、书籍和杂志创建 3 个不同的类吗?

执行此操作的理想方法是什么?请建议。

【问题讨论】:

  • 这些 CSV 文件是从哪里填充的?如果它来自数据库,最好从数据库中获取此信息。
  • 这些文件是 ';'已分开并已提供。
  • 您最终将不得不读取文件 3 次(每次读取一次)。我会创建 3 个类 AuthorBookMagazine 来相应地表示。然后,可能会有一个帮助类来读取 csv 文件以生成合适的Author 对象、Book 对象和Magazine 对象列表。

标签: java csv


【解决方案1】:

我会创建 3 个List<String[]>,每个都包含来自一个 CSV 文件的矩阵,方法如下:

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;
}

然后你可以将它用作:

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

您现在可以打印所有您想要的内容,例如第一个案例:根据 ISBN 显示所有书籍和杂志

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]);
}

希望我能帮上忙。

编辑

您还可以为每个文件创建 3 个类,并对这些类的列表执行相同操作:List&lt;Authors&gt; List&lt;Books&gt; List&lt;Magazine&gt;,但如果您只需要回答这 3 个问题,则没有必要。

【讨论】:

  • 谢谢。我用你的方法来解决问题。您知道如何使用 Jnuit 测试这些方法吗?由于这些方法的返回类型为 void,而且它们只是打印数据,我不知道如何测试它们。
  • 最好写一个返回List&lt;string&gt;的方法,而不是直接打印。所以你可以用 Junit 测试它。
【解决方案2】:

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

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);

【讨论】:

    【解决方案3】:

    您可以使用 Java CSV API 喜欢OpenCSV

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-20
      • 2019-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-16
      相关资源
      最近更新 更多