以下は、指定された内容を満たすJavaプログラムの例です。このプログラムでは、ループ中にエラーが発生した場合に、エラーログファイルにエラーメッセージを出力します。
このプログラムは以下を行います:
- 対象のCSVファイルを1行ずつ読み込む。
- エラー発生時は、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";
}
}
コードの説明
- CSVファイルの読み込み:
- コマンドライン引数を通じてCSVファイルのパスを受け取ります。
BufferedReaderを使用してCSVファイルを1行ずつ読み込みます。
- エラーログファイルの命名:
- 現在の日付と時刻を使ってログファイル名を動的に生成します。
- 例:
error_20231028_121530.txt(2023年10月28日12時15分30秒の場合)。
- VINとエラー内容のログ書き込み:
- レコードがどのようなフォーマットでエラーを引き起こしたのかを出力します。
- VIN(1列目)とエラー詳細(例外メッセージ)をログファイルに出力します。
- 例外処理:
- 任意のエラーが発生した場合(例: VINが空、データフォーマットの不整合など)、その詳細をログファイルに書き込んで安全にループを続行します。
- リソースのクローズ:
BufferedReaderとBufferedWriterをfinallyブロック内でクローズしてリソースリークを防ぎます。
実行方法
- 上記のコードをファイル名
CsvErrorLogger.javaとして保存します。 - ターミナル(またはコマンドプロンプト)で以下を実行しプログラムをコンパイルします:
javac CsvErrorLogger.java
- コンパイル後、プログラムを次のように実行します。
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()でパスを組み合わせて指定できます。 - エラーが発生した行の処理停止: 現在はエラー発生時にその行だけスキップしますが、動作を変更したい場合は例外処理ロジックを調整してください。
このプログラムをもとに、要件に応じたカスタマイズが可能です!

コメント