MATSIM
PersonMoneyEventsAggregator.java
Go to the documentation of this file.
1 /* *********************************************************************** *
2  * project: org.matsim.*
3  * PersonMoneyEventsAggregator.java
4  * *
5  * *********************************************************************** *
6  * *
7  * copyright : (C) 2021 by the members listed in the COPYING, *
8  * LICENSE and WARRANTY file. *
9  * email : info at matsim dot org *
10  * *
11  * *********************************************************************** *
12  * *
13  * This program is free software; you can redistribute it and/or modify *
14  * it under the terms of the GNU General Public License as published by *
15  * the Free Software Foundation; either version 2 of the License, or *
16  * (at your option) any later version. *
17  * See also COPYING, LICENSE and WARRANTY file *
18  * *
19  * *********************************************************************** */
20 
21 package org.matsim.analysis.personMoney;
22 
23 import com.google.inject.Inject;
24 import org.apache.commons.csv.CSVFormat;
25 import org.apache.commons.csv.CSVPrinter;
26 import org.apache.logging.log4j.LogManager;
30 
31 import java.io.IOException;
32 import java.nio.file.Files;
33 import java.nio.file.Paths;
34 import java.util.HashMap;
35 import java.util.Map;
36 import java.util.TreeMap;
37 
44 
45  private final Map<String, Map<String, Double>> personMoneyAmountSumByPurposeAndTransactionPartner = new HashMap<>();
46  private final String DEL;
47 
48  @Inject
50  this.DEL = globalConfigGroup.getDefaultDelimiter();
51  }
52 
53  @Override
54  public void reset(int iteration) {
55  personMoneyAmountSumByPurposeAndTransactionPartner.clear();
56  }
57 
58  @Override
59  public void handleEvent(PersonMoneyEvent event) {
60  String purpose = event.getPurpose() == null ? "null" : event.getPurpose();
61  String transactionPartner = event.getTransactionPartner() == null ? "null" : event.getTransactionPartner();
62  Map<String, Double> transactionPartnerMap = personMoneyAmountSumByPurposeAndTransactionPartner.computeIfAbsent(purpose, k -> new HashMap<>());
63  transactionPartnerMap.put(transactionPartner, event.getAmount() + transactionPartnerMap.getOrDefault(transactionPartner, 0.0));
64  }
65 
66  void writeOutput(String outputFilename) {
67  try (CSVPrinter csvPrinter = new CSVPrinter(
68  Files.newBufferedWriter(Paths.get(outputFilename)),
69  CSVFormat.DEFAULT.withDelimiter(DEL.charAt(0)))) {
70  csvPrinter.printRecord("purpose", "transactionPartner", "sumAmount");
71 
72  // sort output
73  Map<String, Map<String, Double>> purpose2EntriesSorted = new TreeMap<>(personMoneyAmountSumByPurposeAndTransactionPartner);
74 
75  for (Map.Entry<String, Map<String, Double>> entryPurposeLevel: purpose2EntriesSorted.entrySet()) {
76  Map<String, Double> transactionPartner2EntriesSorted = new TreeMap<>(entryPurposeLevel.getValue());
77  for (Map.Entry<String, Double> entryTransactionPartnerLevel: transactionPartner2EntriesSorted.entrySet()) {
78  csvPrinter.printRecord(entryPurposeLevel.getKey(), entryTransactionPartnerLevel.getKey(), entryTransactionPartnerLevel.getValue());
79  }
80  }
81  } catch (IOException e) {
82  LogManager.getLogger(getClass()).error("Could not write " + outputFilename + ".");
83  }
84  }
85 }
final Map< String, Map< String, Double > > personMoneyAmountSumByPurposeAndTransactionPartner