簡體   English   中英

如何解析具有多個鍵值對的CSV?

[英]How to parse a CSV with multiple key-value pairs?

我有以下格式的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]);

        }

因此,我想將它們全部添加到自己的列表中,然后遍歷所有列表並比較值,但是我無法確定其工作原理。 任何提示或建議的話都非常感謝。 謝謝!

通過分析您的需求,您可以更好地了解要使用的數據結構。 由於您需要將鍵(帳戶/公司)映射到值(名稱/代表),因此我將從HashMap開始。 由於您想壓縮值以刪除重復項,因此可能要使用Set

我將有一個Map<Key, Data>

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

好吧,我可能會創建一個類,例如“ Account”,其屬性為“ accountName”,“ fullName”,“ customerSystemName”,“ salesRep”。 然后,我將定義一個Account類型的空ArrayList,然后遍歷讀取的行。 對於每條讀取行,我將創建一個此類的新對象,設置相應的屬性,然后將該對象添加到列表中。 但是創建對象之前 ,我將遍歷列表中已經存在的對象,以查看是否已經有該公司名稱-如果是這種情況,那么,無需創建新對象,只需重置salesRep屬性通過添加新值(以逗號分隔)來表示舊值。

我希望這有幫助 :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM