繁体   English   中英

我应该使用哪种数据结构从Java中的CSV文件或制表符分隔值文件中获取并保留数据

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM