Javaのスクリプト2

以下は、指定された内容を満たすJavaプログラムの例です。このプログラムでは、ループ中にエラーが発生した場合に、エラーログファイルにエラーメッセージを出力します。

このプログラムは以下を行います:

  1. 対象のCSVファイルを1行ずつ読み込む。
  2. エラー発生時は、VIN(仮にCSVの1列目と仮定)とエラーの詳細をerror_年月日時分秒.txtファイルに書き込む。

完全なサンプルコード

import java.io.*;
import java.text.SimpleDateFormat;
import java.util.*;

public class CsvErrorLogger {
    public static void main(String[] args) {
        // コマンドライン引数でCSVファイルのパスを取得
        if (args.length != 1) {
            System.out.println("使用法: java CsvErrorLogger <CSVファイルパス>");
            return;
        }

        String csvFilePath = args[0];
        BufferedReader reader = null;
        BufferedWriter errorWriter = null;

        try {
            // 読み込み用のBufferedReaderを作成
            reader = new BufferedReader(new FileReader(csvFilePath));

            // エラーログファイル名を「error_年月日時分秒.txt」に設定
            String errorLogFileName = generateErrorLogFileName();
            errorWriter = new BufferedWriter(new FileWriter(errorLogFileName));
            System.out.println("エラーログ: " + errorLogFileName);

            String line;
            while ((line = reader.readLine()) != null) {
                try {
                    // 行をカンマ(,)で分割
                    String[] columns = line.split(",");

                    // VINは配列の最初の項目と仮定
                    if (columns.length == 0) {
                        throw new IllegalArgumentException("VINが存在しません");
                    }
                    String vin = columns[0];

                    // デモとして、任意のチェック条件でエラーを発生させる
                    if (vin.isEmpty()) {
                        throw new IllegalArgumentException("VINが空です");
                    }

                    // 任意の処理をここで実行
                    System.out.println("VIN処理中: " + vin);

                } catch (Exception e) {
                    // エラーログにVINとエラー詳細を記録
                    errorWriter.write("エラー発生: " + new Date());
                    errorWriter.write("\n");
                    errorWriter.write("行データ: " + line + "\n");
                    errorWriter.write("エラー内容: " + e.getMessage() + "\n\n");
                    errorWriter.flush();
                    System.out.println("エラーが発生しました: " + e.getMessage());
                }
            }

        } catch (IOException e) {
            System.out.println("読み取りまたは書き込み中にエラーが発生しました: " + e.getMessage());

        } finally {
            // リソースのクローズ処理
            try {
                if (reader != null) reader.close();
                if (errorWriter != null) errorWriter.close();
            } catch (IOException e) {
                System.out.println("クローズ処理中にエラーが発生しました: " + e.getMessage());
            }
        }
    }

    // エラーログのファイル名を生成
    private static String generateErrorLogFileName() {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd_HHmmss");
        String timestamp = dateFormat.format(new Date());
        return "error_" + timestamp + ".txt";
    }
}

コードの説明

  1. CSVファイルの読み込み:
  • コマンドライン引数を通じてCSVファイルのパスを受け取ります。
  • BufferedReaderを使用してCSVファイルを1行ずつ読み込みます。
  1. エラーログファイルの命名:
  • 現在の日付と時刻を使ってログファイル名を動的に生成します。
  • 例: error_20231028_121530.txt(2023年10月28日12時15分30秒の場合)。
  1. VINとエラー内容のログ書き込み:
  • レコードがどのようなフォーマットでエラーを引き起こしたのかを出力します。
  • VIN(1列目)とエラー詳細(例外メッセージ)をログファイルに出力します。
  1. 例外処理:
  • 任意のエラーが発生した場合(例: VINが空、データフォーマットの不整合など)、その詳細をログファイルに書き込んで安全にループを続行します。
  1. リソースのクローズ:
  • BufferedReaderBufferedWriterfinallyブロック内でクローズしてリソースリークを防ぎます。

実行方法

  1. 上記のコードをファイル名CsvErrorLogger.javaとして保存します。
  2. ターミナル(またはコマンドプロンプト)で以下を実行しプログラムをコンパイルします:
   javac CsvErrorLogger.java
  1. コンパイル後、プログラムを次のように実行します。example.csv は実際に処理したいCSVファイルのパスに置き換えてください:
   java CsvErrorLogger example.csv

出力例

CSVファイル (example.csv):

VIN123,Name1,Data1
VIN456,Name2,Data2
,Name3,Data3
VIN789,Name4,Data4

実行結果(ターミナル出力):

VIN処理中: VIN123
VIN処理中: VIN456
エラーが発生しました: VINが空です
VIN処理中: VIN789
エラーログ: error_20231028_121530.txt

エラーログファイル (error_20231028_121530.txt):

エラー発生: Sat Oct 28 12:15:30 2023
行データ: ,Name3,Data3
エラー内容: VINが空です

カスタマイズ案

  • VINの位置変更: VINが1列目以外の場合、columns[0]のインデックスを変更してください。
  • エラーログの保存場所: ログファイルの出力ディレクトリを指定したい場合、generateErrorLogFileName()でパスを組み合わせて指定できます。
  • エラーが発生した行の処理停止: 現在はエラー発生時にその行だけスキップしますが、動作を変更したい場合は例外処理ロジックを調整してください。

このプログラムをもとに、要件に応じたカスタマイズが可能です!

コメント

タイトルとURLをコピーしました