将多行组合为一行

时间:2016-10-16 17:14:01

标签: java csv grouping

想象一下,我是这个数据集:

1   A   AA
1   A   BB
1   A   CC
2   C   AA
3   A   DD
3   W   CC
4   W   DD

我用CSV格式化了这个。我怎样才能在Java中通过第一列对此进行分组,如:

1   A   AA;BB;CC
2   C   AA
3   A   DD
3   W   CC
4   W   DD

我只有这段代码:

String[] array = new array[5]; //to fill with the new dataset
PrintWriter p = new PrintWriter(new File("TABLE.csv")); //the first dataset
StringBuilder sb = new StringBuilder();

for (int i = 0; i < ) 
{
    sb.append(array[1]);
    sb.append(',');
    sb.append(array[1]);
    sb.append(',');
}

如何基于第一列连接所有最后一列?

1 个答案:

答案 0 :(得分:0)

你想要做的是创建一个Map&lt;'Pair,LinkedList&lt;'String&gt;&gt;用于收集数据的对象,其中Pair是表示前两列的类。给我几分钟,我会带回一些代码给你看。

import java.io.File;
import java.io.FileNotFoundException;
import java.util.*;

public class Main {

    public static void main(String args[]) throws FileNotFoundException {

//        Scanner scanner = new Scanner(System.in);
        Scanner scanner = new Scanner(new File("TABLE.csv"));

        Map<Pair, List<String>> output = new HashMap<Pair, List<String>>();

        while (scanner.hasNext()) {
            String col1 = scanner.next();
            String col2 = scanner.next();
            String value = scanner.next();

            Pair pair = new Pair(col1, col2);

            if (output.containsKey(pair)) {
                output.get(pair).add(value);
            } else {
                output.put(pair, new LinkedList<String>());
                output.get(pair).add(value);
            }

        }

        System.out.println(output.toString());

    }

}

class Pair {

    private String col1;

    @Override
    public String toString() {
        return "Pair{" +
                "col1='" + col1 + '\'' +
                ", col2='" + col2 + '\'' +
                '}';
    }

    public Pair(String col1, String col2) {
        this.col1 = col1;
        this.col2 = col2;
    }

    private String col2;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Pair pair = (Pair) o;

        if (col1 != null ? !col1.equals(pair.col1) : pair.col1 != null) return false;
        return col2 != null ? col2.equals(pair.col2) : pair.col2 == null;

    }

    @Override
    public int hashCode() {
        int result = col1 != null ? col1.hashCode() : 0;
        result = 31 * result + (col2 != null ? col2.hashCode() : 0);
        return result;
    }
}

这不是一个完美的解决方案,但它可以工作,并会让你在某个地方开始。考虑添加某种输入错误处理,此代码假定输入每次都是完美的。