[英]which data structure should I use to fetch and keep data from a CSV file or a tab seperated value file in java
我有一个CSV / tab分隔文件,基本上有一个表的数据,我需要将其提取到java中,以后再用于与数据库中的表进行比较。 我实际上是在使用2d数组之前完成此操作的,但是我认为当文件大小增加时,效率不是很高。 而且,二维数组中的任何操作都需要大量循环和条件。 那么我应该在Java或2d数组中选择哪种数据结构就好了呢?
我认为,如果您需要处理列,则可以使用“地图列表”来完成此工作:
List<Map<String, String>> table = new ArrayList<Map<String, String>>();
然后,每一行可以是Map<String, String>
,键是列的名称,值是实际值。
for (int i = 0; i < TABLE_ROWS; i++)
Map<String, String> row = new HashMap<String, String>();
row.put("column1", "value 1");
row.put("column2", "value 2");
...
table.add(row);
}
因此,当您必须使用特定值时,您可以执行以下操作:
table.get(ROW_NUMBER).get(COLUMN_NAME);
或者,您可以编写一个POJO,用作YoungHobbit的建议,作为行的模型,并使用该POJO代替Map。
您可以为CSV
文件中的属性定义POJO
类。 使用jackson-csv
库从csv文件读取数据并创建自定义类型的对象。
如果数据库的属性也与csv文件相同,则可以从中创建对象。 在这种情况下,您可以使用equals
方法比较这两个对象,需要根据需要对其进行覆盖 。
否则,您可以编写不同的实现方案以进行比较。
我相信您可以按照@YoungHobbit的建议使用POJO,但是在那种情况下,您必须确保每一行中都有某些字段。 可以有更少但不是新的列。
要么
您可以使用HashMap<String, List<String>>.
这样,您可以将唯一字段用作键,并将其余字段用作列表中的值。
正确的答案是:这取决于您要使用它做什么。
通用答案是
List<List<String>> csv = new ArrayList<>();
并为每行创建一个新的ArrayList。
String cell = csv.get(row).get(column);
如果CVS中有很多孔,则可以使用可比较的对象作为坐标。
public class Coordinate implements Comparable<Coordinate> {
public int row;
public int column;
public Coordinate(int r, int c) {
row = r;
column = c;
}
@Override
public int compareTo(Coordinate o) {
int r = Integer.compare(row, o.row);
if(r == 0) {
r = Integer.compare(column, o.column);
}
return r;
}
public boolean equals(Object o) {
if(o instanceof Coordinate) {
Coordinate c = (Coordinate)o;
return row == c.row && column == c.column;
}
return false;
}
}
然后使用TreeMap:
TreeMap<Coordinate, String> csv = new TreeMap<>();
csv.put(new Coordinate(1,2), "Hello");
String cell = csv.get(new Coordinate(3,4));
for(Map.Entry<Coordinate, String> e : csv.entrySet()) {
Coordinate c = e.getKey();
String cell = e.getValue();
}
for(String cel : csv.values()){
//...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.