Добавить к существующему CSV-файлу заголовки

#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 создается без заголовков.