我有一个test.csv文件格式为:
Home,Owner,Lat,Long
5th Street,John,5.6765,-6.56464564
7th Street,Bob,7.75,-4.4534564
9th Street,Kyle,4.64,-9.566467364
10th Street,Jim,14.234,-2.5667564
我有一个散列图,它读取的文件包含相同的标题内容,例如CSV,只是一种不同的格式,没有附带的数据。
例如:
Map<Integer, String> container = new HashMap<>();
其中,
键,值
[0][NULL]
[1][Owner]
[2][Lat]
[3][NULL]
我还创建了第二个哈希映射:
BufferedReader reader = new BufferedReader (new FileReader("test.csv"));
CSVParser parser = new CSVParser(reader, CSVFormat.DEFAULT);
Boolean headerParsed = false;
CSVRecord headerRecord = null;
int i;
Map<String,String> value = new HashMap<>();
for (final CSVRecord record : parser) {
if (!headerParsed = false) {
headerRecord = record;
headerParsed = true;
}
for (i =0; i< record.size(); i++) {
value.put (headerRecord.get(0), record.get(0));
}
}
我想读取并比较hashmap,如果容器映射具有值map中的值,那么我将该值放入相应的对象中。
示例对象
public DataSet (//args) {
this.home
this.owner
this.lat
this.longitude
}
我想创建一个函数,在比较散列图时,当值映射键等于包含映射键时,在对象内部设置数据,并将放置的值设置到对象中。在处理设置方面也非常简单。
请注意:我制作了CSV标题和行有限,在现实生活中,CSV可以有x个字段(Home,Owner,Lat,Long,houseType,houseColor等等),以及一些与这些字段相关联的值
答案 0 :(得分:0)
首先,您解决此问题的方法过于漫长。从我看到的,你要做的就是:
从CSV文件中选择两个列,并将它们添加到数据结构中。我突出显示了 two 这个词,因为在地图中,你有一个键和一个值。一列成为键,另一列成为值。
你应该做什么:
将要添加到数据结构中的列的名称导入两个字符串。 (您可以从文件中读取它们。)
使用您所做的CSVParser
课程迭代CSV文件。
将对应于第一个所需列的值存储在字符串中,使用与第二个所需列对应的值重复,并将它们都推入DataSet
对象,然后按{{1}将对象转换为DataSet
。
如果您愿意坚持解决问题的方法:
基本上,空文件应该只包含标题(列名),这就是你为什么命名相应的哈希映射List<DataSet>
的原因。第二个文件应该包含值,因此您命名了相应的哈希映射containers
。
首先,你说的地方
values
你可能想说
if (!headerParsed = false) {
headerRecord = record;
headerParsed = true;
}
和你说的地方
if (!headerParsed) {
headerRecord = record;
headerParsed = true;
}
你可能意味着
for (i =0; i< record.size(); i++) {
value.put(headerRecord.get(0), record.get(0));
}
即。您迭代一条记录并存储与for (i =0; i< record.size(); i++) {
value.put(headerRecord.get(i), record.get(i));
}
对应的value
。
现在我还没有在我的桌面上尝试过这段代码,但由于for循环也遍历Home和Longitude,我认为它应该会产生错误,你应该在调用column
之前添加额外的检查(即value.put
应该创建一个我想的错误)。将其包裹在value.put("Home", "5th Street")
条件内,并检查容器哈希映射中是否存在if
。
headerRecord(i)
现在的情况是,数据结构本身取决于您要存储的容器哈希映射中的哪些值。它可能是Home和Lat,或者所有者和Long。所以我们被困住了。你如何创建如下的数据结构:
for (i =0; i< record.size(); i++) {
if (container[headerRecord.get(i)] != NULL) {
value.put(headerRecord.get(i), record.get(i));
}
}
另请注意,此DataSet仅用于存储一行。要存储多行信息,您需要创建struct DataSet {
string val1;
string val2;
}
Linked List
。
最后,容器文件包含所有列名。并非所有这些列都将存储在数据集中(即,您选择了NULL Home和Long。您可以选择NULL Owner和Lat),因此头文件不是您做出此决定所需的。
如果您考虑一下,只需迭代值哈希映射并将第一个值存储在字符串DataSet
中,将第二个值存储在val1
中。
val2
我希望这会有所帮助。