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

Java 如何解析具有多个键值对的CSV?,java,csv,parsing,Java,Csv,Parsing,我有一个以下格式的CSV: “账户名称”、“全名”、“客户系统名称”、“销售代表” “0x7a69”、“迈克·史密斯”、“0x7a69”、“蒂姆·格雷夫斯” “0x7a69”、“约翰·泰勒”、“0x7a69”、“布莱恩·安东尼” “苹果”、“史蒂夫•乔布斯”、“苹果”、“安东尼•迈克尔” “苹果”、“史蒂夫·乔布斯”、“苹果”、“布莱恩·安东尼” “苹果”、“蒂姆•库克”、“苹果”、“蒂姆•格雷夫斯” 我想解析此CSV(使用Java),使其成为: “账户名称”、“全名”、“客户系统名称”、“销

我有一个以下格式的CSV:

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

“0x7a69”、“迈克·史密斯”、“0x7a69”、“蒂姆·格雷夫斯”

“0x7a69”、“约翰·泰勒”、“0x7a69”、“布莱恩·安东尼”

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

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

“苹果”、“蒂姆•库克”、“苹果”、“蒂姆•格雷夫斯”

我想解析此CSV(使用Java),使其成为:

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

“0x7a69”、“迈克·史密斯、约翰·泰勒”、“0x7a69”、“蒂姆·格雷夫斯、布赖恩·安东尼”

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

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

        }
String csvFile=“something.csv”;
字符串行=”;
字符串cvsSplitBy=“,”;
List accountList=new ArrayList();
列表名称列表=新的ArrayList();
List systemNameList=newarraylist();
List salesList=new ArrayList();
try(BufferedReader br=new BufferedReader(new FileReader(csvFile)))
{
而((line=br.readLine())!=null){
//使用逗号作为分隔符
String[]csv=line.split(cvsSplitBy);
accountList.add(csv[0]);
名称列表。添加(csv[1]);
systemNameList.add(csv[2]);
salesList.add(csv[3]);
}

所以我想把它们都添加到自己的列表中,然后循环浏览所有列表并比较值,但我不知道这是如何工作的。非常感谢任何提示或建议。谢谢!

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

我想要一张带有

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
}

我可能会创建一个类,比如说“Account”,它的属性是“accountName”、“fullName”、“customerSystemName”、“salesRep”。然后我会定义一个Account类型的空ArrayList,然后在读取行上循环。对于每个读取行,我只会创建一个此类的新对象,设置相应的属性并将对象添加到列表中。但是在创建对象之前,我会迭代列表中已经存在的对象,以查看还有一个已经有了这个公司名称——如果是这种情况,那么,不创建新对象,只需通过添加新值(用逗号分隔)重置旧对象的salesRep属性即可

我希望这有帮助:)

    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