Java:将CSV文件转换为BINARY文件

时间:2013-01-19 08:12:46

标签: 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。

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

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

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

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

naiveBufSearchEq columnNum值:打印表格中列数值为columnNum的值等于给定值的行。列号从一开始。 naiveBufSearchGtr columnNum值:打印表格行columnNum中的值大于给定值的行。

任务C(50分)

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

binaryLoad filename:将带有filename的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)?

1 个答案:

答案 0 :(得分:1)

鉴于更新的目标,我将通过该文件并在密钥上构建 排序索引 。索引将包含键值以及每个记录与该键的偏移量。然后我会编写一个新文件,其中包含索引,后跟原始数据。如果允许使用两个文件,只需将索引作为单独的文件写入磁盘即可。

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

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

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