【问题标题】:How to parse a CSV with multiple key-value pairs?如何解析具有多个键值对的 CSV?
【发布时间】:2017-05-09 17:57:49
【问题描述】:

我有一个这种格式的 CSV:

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

"0x7a69","Mike Smith","0x7a69","Tim Greaves"

"0x7a69","约翰·泰勒","0x7a69","布莱恩·安东尼"

“苹果”、“史蒂夫·乔布斯”、“苹果”、“安东尼·迈克尔”

“苹果”、“史蒂夫·乔布斯”、“苹果”、“布莱恩·安东尼”

“苹果”、“蒂姆·库克”、“苹果”、“蒂姆·格里夫斯”

...

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

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

"0x7a69","Mike Smith, John Taylor","0x7a69","Tim Greaves, Brian Anthony"

“苹果”、“史蒂夫·乔布斯、蒂姆·库克”、“苹果”、“安东尼·迈克尔、布莱恩·安东尼、蒂姆·格里夫斯”

基本上我只是想压缩 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]);

        }

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

【问题讨论】:

    标签: java csv parsing


    【解决方案1】:

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

    我会有一个Map&lt;Key, Data&gt;

    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
    }
    

    一旦您的数据结构就位,您可以执行以下操作以从您的 CSV 填充数据并将其输出到其自己的 CSV(以伪代码形式)

        Loop each line in CSV
          Build Key from account/company
          Try to get data from Map
          If Data not found
            Create new data with Key and put key -> data mapping in map
          add name and rep to data
    
        Loop values in map
          Output to CSV
    

    【讨论】:

      【解决方案2】:

      好吧,我可能会创建一个类,比如说“Account”,其属性为“accountName”、“fullName”、“customerSystemName”、“salesRep”。然后我会定义一个 Account 类型的空 ArrayList,然后遍历读取的行。对于每一个读取的行,我只需创建一个此类的新对象,设置相应的属性并将对象添加到列表中。但是创建对象之前,我会遍历列表中已经存在的对象,以查看是否有一个已经具有该公司名称的对象 - 如果是这种情况,那么,而不是创建新的对象,只需通过添加新值来重置旧的 salesRep 属性,用逗号分隔。

      我希望这会有所帮助:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-06
        • 1970-01-01
        相关资源
        最近更新 更多