如何解析具有多个键值对的CSV?

时间:2017-05-09 17:57:49

标签: java csv parsing

我有这种格式的CSV:

“帐户名称”,“全名”,“客户系统名称”,“销售代表”

“0x7a69”,“Mike Smith”,“0x7a69”,“Tim Greaves”

“0x7a69”,“John Taylor”,“0x7a69”,“Brian Anthony”

“Apple”,“Steve Jobs”,“apple”,“Anthony Michael”

“Apple”,“Steve Jobs”,“apple”,“Brian Anthony”

“Apple”,“Tim Cook”,“apple”,“Tim Greaves”

...

我想解析这个CSV(使用Java),以便它变成:

“帐户名称”,“全名”,“客户系统名称”,“销售代表”

“0x7a69”,“Mike Smith,John Taylor”,“0x7a69”,“Tim Greaves,Brian Anthony”

“Apple”,“Steve Jobs,Tim Cook”,“apple”,“Anthony Michael,Brian Anthony,Tim Greaves”

基本上我只想压缩CSV,以便每个帐户/公司名称都有一个条目。

这是我到目前为止所做的:

String csvFile = "something.csv";
String line = "";
String cvsSplitBy = ",";

List<String> accountList = new ArrayList<String>();
List<String> nameList = new ArrayList<String>();
List<String> systemNameList = new ArrayList<String>();
List<String> salesList = new ArrayList<String>();

try (BufferedReader br = new BufferedReader(new FileReader(csvFile))) 
    {

        while ((line = br.readLine()) != null) {

            // use comma as separator
            String[] csv = line.split(cvsSplitBy);

            accountList.add(csv[0]);
            nameList.add(csv[1]);
            systemNameList.add(csv[2]);
            salesList.add(csv[3]);

        }

所以我想把它们全部添加到自己的列表中,然后循环遍历所有列表并比较值,但我无法理解它是如何工作的。任何提示或建议的话都非常感谢。谢谢!

2 个答案:

答案 0 :(得分:0)

通过分析您的要求,您可以更好地了解要使用的数据结构。由于您需要将键(帐户/公司)映射到值(名称/代表),我将从HashMap开始。由于您希望压缩值以删除重复项,因此您可能希望使用Set

我会{/ 1}}

Map<Key, Data>

完成数据结构后,您可以执行以下操作来填充CSV中的数据并将其输出到自己的CSV(伪代码)

public class Key {
    private String account;
    private String companyName;

    //Getters/Setters/equals/hashcode
}

public class Data {
    private Key key;
    private Set<String> names = new HashSet<>();
    private Set<String> reps = new Hashset<>();

    public void addName(String name) {
        names.add(name);
    }

    public void addRep(String rep) {
        reps.add(rep);
    }

    //Additional getters/setters/equals/hashcode
}

答案 1 :(得分:0)

好吧,我可能会创建一个课程,让我们说&#34;帐户&#34;,使用属性&#34; accountName&#34;,&#34; fullName&#34;,&# 34; customerSystemName&#34;,&#34; salesRep&#34;。然后我将定义一个类型为Account的空ArrayList,然后遍历读取行。对于每个读取行,我只是创建该类的新对象,设置相应的属性并将该对象添加到列表中。但是创建对象之前我会迭代列表中已有的对象以查看是否有一个已经有这个公司名称的对象 - 如果是这种情况,那么,而不是创建新的对象,只需通过添加新值(以逗号分隔)重置旧的salesRep属性。

我希望这会有所帮助:)