import com.opencsv.*;
import java.io.*;
import java.util.*;
public class CSVSumWithInsertOpenCSV {
    public static void main(String[] args) throws IOException {
        String inputFile = "input.csv";
        String outputFile = "output.csv";
        // 加算対象の列名
        List<String> sumHeaders = Arrays.asList("Math", "Science", "English");
        String insertAfter = "English"; // この列の右に "Total" を挿入
        try (
            CSVReader reader = new CSVReader(new FileReader(inputFile));
            CSVWriter writer = new CSVWriter(new FileWriter(outputFile))
        ) {
            List<String[]> allRows = reader.readAll();
            if (allRows.isEmpty()) return;
            // ヘッダー取得
            String[] originalHeader = allRows.get(0);
            List<String> newHeader = new ArrayList<>(Arrays.asList(originalHeader));
            int insertIndex = newHeader.indexOf(insertAfter) + 1;
            newHeader.add(insertIndex, "Total");
            writer.writeNext(newHeader.toArray(new String[0]));
            // 各データ行の処理
            for (int i = 1; i < allRows.size(); i++) {
                String[] row = allRows.get(i);
                List<String> newRow = new ArrayList<>();
                // 合計の算出
                double sum = 0;
                Map<String, String> rowMap = new HashMap<>();
                for (int j = 0; j < originalHeader.length && j < row.length; j++) {
                    rowMap.put(originalHeader[j], row[j]);
                }
                for (String key : sumHeaders) {
                    try {
                        sum += Double.parseDouble(rowMap.getOrDefault(key, "0"));
                    } catch (NumberFormatException e) {
                        // 数値変換できない場合は 0 扱い
                        sum += 0;
                    }
                }
                // 新しい行を構築しながら "Total" を挿入
                for (int j = 0; j <= originalHeader.length; j++) {
                    if (j == insertIndex) {
                        newRow.add(String.valueOf(sum));
                    }
                    if (j < originalHeader.length) {
                        newRow.add(row[j]);
                    }
                }
                writer.writeNext(newRow.toArray(new String[0]));
            }
        }
    }
}
Register as a new user and use Qiita more conveniently
- You get articles that match your needs
 - You can efficiently read back useful information
 - You can use dark theme