当前位置: 首页 > 知识库问答 >
问题:

从CSV文件读取数据,比较并显示在Java

权烨磊
2023-03-14

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

  • 作者文件的列:emailID | firstname | lastname

我需要展示:

  1. 根据ISBN显示所有书籍和杂志

我现在使用的是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] + "]");  

  }
}

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

>

String csvFileToRead 

到String数组

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

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

  • 我应该使用2D数组吗?
  • 我需要在DS中读取和存储数据以实现目标吗?

我应该为作者,书籍和杂志制作3个不同的类吗?

理想的方法是什么?请建议。

共有3个答案

葛浩阔
2023-03-14

您可以使用像OpenCSV这样的JavaCSVAPI

穆锋
2023-03-14

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

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文件时,您可以填写一个将ISBN映射到一本书的HashMap,以及一个类似的用于杂志的HashMap,您可以使用它通过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);

同样,通过书名获得一本书或杂志。

至于按作者获取图书,您需要将作者的邮件地址映射到图书的列表,因为一个作者可以有多本图书:

Map<String, List<Book>> authorBookMap = new HashMap<String, List<Book>>();
List<Book> books = authorBookMap.get(authorAddress);
祁曦哲
2023-03-14

我会创建3List

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

 类似资料:
  • 问题内容: 如何从.txt文件读取和显示数据? 问题答案: 然后,您可以使用in.readLine(); 一次读取一行。要读到最后,可以这样编写while循环:

  • 问题内容: 我正在从包含以下数据的CSV文件(xyz.CSV)中读取数据: 当我使用循环对其进行迭代时,我可以按以下代码逐行打印数据,并且仅打印column1数据。 通过上面的代码,我只能得到第一列。 如果我尝试打印line [1]或line [2],则会出现以下错误。 请建议打印列2或列3的数据。 问题答案: 这是我获得第二列和第三列的方法: 结果如下:

  • 我对JavaFX和JavaFX Scene Builder是新手,几个星期以来一直在研究并试图弄清楚如何简单地从文本文件中读取并在文本中显示其内容。我的controller类中有一个很好的文件读取功能,但我不知道如何将文本文件显示到fxml文档中的文本区域。我已经学会了如何单击按钮并使文件显示在文本区域中,但我希望GUI加载后立即在文本区域中显示内容。如果任何人有一个想法如何去做这件事,你的帮助将

  • 本文向大家介绍js读取csv文件并使用json显示出来,包括了js读取csv文件并使用json显示出来的使用技巧和注意事项,需要的朋友参考一下 摘要: 前面分享了用js将json数据下载为csv文件,方便后期管理。但是对于测试人员更希望能够以页面的形式展现任务,所以就做了一个将csv文件展现在页面上的例子。 代码: 效果图: 注意:上面的例子需要服务环境

  • 我正在尝试读取Mac上pig shell上的csv文件。我所做的只是文件到变量中,然后变量。我是这样做的: 我使用的数据是从这里提供的github下载的 此文件在我的Mac上的本地安装的hdfs中可用。当我执行时,我得到一个错误: org.apache.pig.impl.logicallayer.FrontendException:错误1066:无法打开别名影片的迭代器 在org.apache.p

  • 我试图比较两个xml文件并显示差异,如果找到的话。 目前,我正在使用XML Diff来查找差异。 也查看了xnode.deepeQuals,但它也返回是否有任何区别。但不是什么区别。 任何帮助都很感激