#java #csv
#java #csv
Вопрос:
У меня есть метод, который добавляется к файлу .csv, но проблема в том, что он также добавляет строку заголовка каждый раз. Как я могу правильно добавить файл .csv?
Я знаю, что добавление в список выполнит эту работу, но этот метод вызывается в отдельных запусках.
public static void writeToCSVFileAndSend(String facilityId, int candidateStockTakeContainersCount) throws IOException {
FileWriter report = new FileWriter("/tmp/MonthlyExpectedComplianceSuggestions.csv", true);
LocalDate today = java.time.LocalDate.now();
String[] headers = { "Warehouse", "Expected Count for " today.getMonth().getDisplayName(TextStyle.SHORT, Locale.ENGLISH)};
Map<String, Integer> facilityExpectedMonthlyCountMap= new HashMap<String, Integer>() {
{
put(facilityId, candidateStockTakeContainersCount);
}
};
try (CSVPrinter printer = new CSVPrinter(report, CSVFormat.DEFAULT
.withHeader(headers))) {
facilityExpectedMonthlyCountMap.forEach((a, b) -> {
try {
printer.printRecord(a, b);
} catch (IOException e) {
e.printStackTrace();
}
});
}
}
Текущий вывод
Warehouse,Expected Count for Dec
A,2147
Warehouse,Expected Count for Dec
B,0
Ожидаемый результат
Warehouse,Expected Count for Dec
A,2147
B,0
Комментарии:
1. как вы вызываете метод writeToCSVFileAndSend? Поскольку ваш вывод показывает 2 записи, я предполагаю, что вы вызываете writeToCSVFileAndSend для каждой пары facilityId и candidateStockTakeContainersCount Если вы вызываете метод дважды, он будет создавать объект CSVPrinter при каждом вызове и добавлять к нему заголовок
2. Да, я вызываю метод несколько раз, в нескольких прогонах (в течение нескольких дней). Я понимаю, почему заголовок добавляется каждый раз, но есть ли способ проверить, присутствует ли заголовок, мы его пропускаем?
Ответ №1:
Чтобы избежать нескольких заголовков, вы должны создать объект CSVPrinter один раз и повторно использовать его В зависимости от того, как вы получаете данные, вы можете разделить функцию на две части и передать объект CSVPrinter.
public static void writeToCSVFileAndSend() throws IOException
{
File outputCSV = new File( "/tmp/MonthlyExpectedComplianceSuggestions.csv");
LocalDate today = java.time.LocalDate.now();
String[] headers = { "Warehouse", "Expected Count for " today.getMonth().getDisplayName(TextStyle.SHORT, Locale.ENGLISH)};
boolean headerRequired = true;
if( outputCSV.exists()){
headerRequired = false;
}
CSVPrinter printer = null;
if( headerRequired){
printer = new CSVPrinter(report, CSVFormat.DEFAULT.withHeader(headers));
}
else{
printer = new CSVPrinter(report);
}
// Iterate through combination of facilityId and candidateStockTakeContainersCount and
// call print record
Map<String, Integer> facilityExpectedMonthlyCountMap= new HashMap<String, Integer>();
// fill in your data in map here
facilityExpectedMonthlyCountMap.forEach((a, b) -> {
try {
printer.printRecord(a, b);
} catch (IOException e) {
e.printStackTrace();
}
});
}
Комментарии:
1. Я не могу этого сделать, поскольку этот метод вызывается в разных запусках.
2. отредактировал код для обработки условия. Если выходной CSV существует, то экземпляр CSVPrinter создается без заголовков.