Java:将CSV文件转换为二进制文件

Java:将CSV文件转换为二进制文件,java,database,csv,binary,Java,Database,Csv,Binary,这是我在数据库课上家庭作业的问题之一 我不明白为什么我们需要将csv文件转换成二进制文件。我认为这样做会使搜索数据变得更加困难。谁能告诉我为什么我们要这么做?是我的老师在愚弄我,还是把一个csv文件转换成二进制文件,以便用二进制搜索方法进行阅读更好。csv文件的一行示例如下: 1|37|O|131251.81|1996-01-02|5-LOW|Clerk#000000951|0|nstructions sleep furiously among 这是老师给我的作业。 我真的被任务C困住了 概述

这是我在数据库课上家庭作业的问题之一

我不明白为什么我们需要将csv文件转换成二进制文件。我认为这样做会使搜索数据变得更加困难。谁能告诉我为什么我们要这么做?是我的老师在愚弄我,还是把一个csv文件转换成二进制文件,以便用二进制搜索方法进行阅读更好。csv文件的一行示例如下:

1|37|O|131251.81|1996-01-02|5-LOW|Clerk#000000951|0|nstructions sleep furiously among
这是老师给我的作业。 我真的被任务C困住了

概述 本作业的目的是帮助您了解查询太大而无法完全放入内存的大型数据集所涉及的问题。为了研究这些问题,您将编写一个java程序,以CSV文件的形式读取数据表,并尽可能高效地在该表上运行查询。提供了程序模板,您的代码应添加到Assignment1.java文件中。提供了一个驱动程序driver.java,以便您可以测试您的程序。驱动程序接受一个文件作为输入,该文件包含程序将解释和执行的命令列表。您将以引导方式实现程序的多个版本。在所有版本中,您必须假设数据可能不适合内存,即无法将所有数据读入内存中的java数据结构

在所有版本中,命令的基本顺序都是从加载数据开始,然后是一系列查询,这些查询是相等查询或范围查询。您可以假设输入正确且行为良好,即此分配的目标不是错误处理。 任务A(15分) 在第一个版本中,您将实现最简单、最简单的解决方案。java程序支持的命令列表必须包括以下内容:

naiveLoad filename:告诉程序以下查询将针对文件名为的csv文件 naiveSearchEq columnNum value:打印表中列号columnNum中的值等于给定值的行。列编号从一开始。 naiveSearchGtr columnNum value:打印表中列号columnNum中的值大于给定值的行

搜索命令应该通过使用java类FileReader逐字符读取CSV文件来实现。您应该阅读FileReader、InputStreamReader等的java文档。您必须使用FileReader类。 任务B(15个临时秘书处) 在第二个版本中,您将使用缓冲IO改进第一个版本。使用BufferedReader类编写第二个版本的搜索命令。按如下方式命名命令和相应的方法:

NaiveBufsearchq columnNum值:打印表中列号columnNum中的值等于给定值的行。列编号从一开始。 naiveBufSearchGtr columnNum值:打印列号columnNum中的值大于给定值的表行

任务C(50分)

在第三个版本中,您将采用不同的方法解决问题。首先加载CSV数据文件并将其转换为二进制文件。您必须将二进制文件命名为“data.bin”。随后的查询将对二进制文件进行操作。您可以自由设计二进制文件的格式。按如下方式命名命令和相应的方法:

binaryLoad文件名:将带有文件名的csv文件转换为二进制文件。二进制文件的文件名应存储在程序中。 binarySearchEq columnNum value:打印表中列号columnNum中的值等于给定值的行。列编号从一开始。 binarySearchGtr columnNum value:打印表中列号columnNum中的值大于给定值的行

任务D(20分) 获取程序版本1、2和3的计时,并比较运行时间。你应该平均计时至少10次。在laulima的在线提交中,回答以下问题:

Tabulate the average running time of the three versions of your program. Compare the running times of the three versions.
How are the timings of the different versions different?
Why are the timings of the different versions different ?
What did you learn in this assignment? What was most difficult/challenging (if any)?

根据更新后的目标,我将遍历该文件,并在键上建立一个排序索引。索引将包含键值和每个记录与该键的偏移量。然后我将编写一个新文件,由索引和原始数据组成。如果允许使用两个文件,只需将索引作为单独的文件写入磁盘即可

索引将比原始文件小得多。当需要搜索时,只读取索引部分(或文件),使用二进制搜索查找键,检索索引项的偏移量,并使用该偏移量查找数据并只读取该记录

如果索引太大而无法放入RAM,那么您必须分两步构建它

  • 读取数据文件并写入索引文件,*un*排序,一次一条记录
  • 使用磁盘排序实用程序对索引进行排序

  • 根据更新后的目标,我将遍历该文件,并在键上建立一个排序索引。索引将包含键值和每个记录与该键的偏移量。然后我将编写一个新文件,由索引和原始数据组成。如果允许使用两个文件,只需将索引作为单独的文件写入磁盘即可

    索引将比原始文件小得多。当需要搜索时,只读取索引部分(或文件),使用二进制搜索查找键,检索索引项的偏移量,并使用该偏移量查找数据并只读取该记录

    如果索引太大而无法放入RAM,那么您必须分两步构建它

  • 读取数据文件并写入索引文件,*un*排序,一次一条记录
  • 使用磁盘排序实用程序对索引进行排序

  • 这还不足以理解你为什么这么做