JAVA CSV文件到Map <string,list <double =“” >>

时间:2019-05-09 14:58:07

标签: java csv dictionary

我被要求从一个csv文件创建一个词向量空间。因此,我需要将单词及其向量(大小为57)提取到字典中,以便能够将其重新用于未来的操作。 我的csv格式给我带来了很多问题,因为它基本上是带有键的文本,并且将所有的双精度字符都用空格隔开,并且直到现在我都无法正确地将字符串和双精度部分分开。

那么您是否知道如何将这个文件解析成包含(键,向量)类型条目的字典。

非常感谢。

这是csv文件的演示:

key1 4.0966564 7.963437 -2.1844673 1.9319566 -0.04495791 2.454401 3.1006012 -0.3813638 1.567303 -2.2067556 3.44506744 -4.382278 4.1457844 2.342756 -2.7707205 3.5015 2.5717492 -2.6846366...

key2 -3.968007 0.86151505 0.06163538 1.918614 0.34340435 -1.5178788 1.3857365 0.230331 0.7025755 -2.6575062 -0.7426953 3.1636698 2.8441591 0.4522623 3.3907628 2.425691 -1.2052362....

。 。

2 个答案:

答案 0 :(得分:0)

这种数据结构称为多图:一个键可以具有多个值。

您可以在库中找到示例。

如果您不想拥有依赖关系,并希望编写自己的依赖关系,它可能看起来像这样:

public class MultiMap {
    private Map<String, List<Double>> multi = new HashMap<>();

    public void put(String key, Double newValue) {
        if (newValue != null) {
            List<Double> values = (this.multi.containsKey(key) ? this.multi.get(key) : new ArrayList<>());
            values.add(newValue);
            this.multi.put(key, values);
        }
    }
}

可以使用泛型,但是我现在懒得打扰。此示例适用于您的狭窄用例。

通过在正则表达式"\\s+"处进行拆分,将每一行拆分为令牌。第一个值是键;遍历所有其他对象,以将其添加到多地图中。

答案 1 :(得分:0)

您可以执行以下操作:

String line = "key1 4.0966564 7.963437";
String[] parts = line.split(" ");
String key = parts[0];
ArrayList<Double> values = new ArrayList<Double>();
for(int i =1; i < parts.length; i++){
  String doubleAsString = parts[i];
  values.add(Double.valueOf(doubleAsString));
}

然后将此元素添加到地图中。