我是java的初学者,我有一个java类,它从CSV文件中读取数据,如下所示:
BUS | ID |负载| Max_Power
1 | 2 | 1 | 10.9
2 | 3 | 2 | 8.0
我的问题是:我必须考虑每次java运行(程序执行),一次只能运行1行。例如,对于我的第一次运行,我只需要读取第一行,然后进行第二次运行,我需要读取第二行的数据。 使用Hashmaps是否是搜索每次运行的密钥的正确方法?
答案 0 :(得分:0)
当您阅读第1行(标题)时,您将|
分割为字符串数组(headerArray
)。然后使用字符串数组中的元素作为键来初始化散列映射<String, List<String>>
(或Multimap
,如果使用guava或其他api)。
然后你读取每个数据行,按|
拆分,再次得到字符串数组(dataArray
),你只需得到地图值:map.get(headerArray[index of dataArray])
。找到映射条目/值后,您可以执行以下逻辑(添加到列表中)。
您还可以设计包含这些属性的ValueObjectType
类型,以及接受int index, String value
的特殊设置器,在那里您可以检查值应该去哪个属性。这样,您不再需要地图,需要List<ValueObjectType>
答案 1 :(得分:0)
当你的程序必须“记住”超出终止的东西时,你需要将这些信息存储在某个地方(文件,注册表......)。
第1步了解如何使用java进行文件I / O(读/写文件)。您需要它来存储您的信息,在这种情况下是行号。)
第2步实施逻辑:
lineToRead
(例如1
)lineToRead
(1
)并解析数据(请查看@Kent的答案以获取有关如何执行此操作的详细解释)lineToRead
(1 -> 2
)并将其保存到内存文件中。提示:当你的程序的多个实例要并行运行时,你必须确保互斥/使整个过程(读取,递增,写入)原子化以防止丢失更新效果。
答案 2 :(得分:0)
您可以使用com.csvreader.CsvReader类(在javacsv.jar中可用) 此类提供逐行读取CSV文件的功能。 这将符合您的目的。
这是示例代码: -
CsvReader csv = new CsvReader(FileName);
csv.readHeaders(); // headers
while (products.readRecord()) {
String cal = csv.get(0);
}