public static String processIfna(String key, String value) {
// keyの形式チェック
if (!key.matches(".*IFNA:(\\d*|\\s*)/(\\d*|\\s*|\\*)")) {
throw new RuntimeException("500000エラー: " + key + " のIFNAパターンが不正です");
}
String[] parts = key.split("IFNA:")[1].split("/");
if (parts.length != 2) {
// "IFNA:0/" のようなパターンを許容するための修正
if (parts.length == 1 && key.endsWith("/")) {
parts = new String[]{parts[0], ""};
} else {
throw new RuntimeException("500000エラー: " + key + " のIFNAパターンが不正です");
}
}
// 空文字の場合には空文字を設定
String nullValueReplacement = parts[0].isEmpty() ? "" : parts[0];
String nonNullValueReplacement = parts[1].isEmpty() ? "" : parts[1];
if (key.contains("/*")) {
return (value == null || value.isEmpty()) ? nullValueReplacement : value;
} else {
return (value == null || value.isEmpty()) ? nullValueReplacement : nonNullValueReplacement;
}
}
json
/**
* キーに基づいて値を加工するメソッド。
*
* @param key 加工処理のパターン
* @param value 元の値
* @return 加工された値
* @throws ParseException 日付のパースエラーが発生した場合
*/
public static String processValue(String key, String value) throws ParseException {
if (key.contains("HEAD:")) {
return processHead(key, value);
} else if (key.contains("ERA:yymmdd")) {
// ERA:yymmddの場合、和暦に変換
return convertToJapaneseEra(value, "yyyyMMdd");
} else if (key.contains("ERA:yymm")) {
// ERA:yymmの場合、和暦に変換
return convertToJapaneseEra(value, "yyyyMM");
} else if (key.contains("IFNA:")) {
return processIfna(key, value);
} else {
throw new RuntimeException("500000エラー: " + key + " に該当しません");
}
}
/**
* HEADパターンに基づいて値を加工するメソッド。
*
* @param key 加工処理のパターン
* @param value 元の値
* @return 加工された値
*/
public static String processHead(String key, String value) {
String[] parts = key.split("HEAD:");
if (parts.length != 2 || !parts[1].matches("\\d+")) {
throw new RuntimeException("500000エラー: " + key + " のHEADパターンが不正です");
}
int headLength = Integer.parseInt(parts[1]);
if (value.length() <= headLength) {
return value; // valueがheadLength以下の場合はそのまま返す
}
return value.substring(0, headLength);
}
/**
* IFNAパターンに基づいて値を加工するメソッド。
*
* @param key 加工処理のパターン
* @param value 元の値
* @return 加工された値
*/
public static String processIfna(String key, String value) {
String[] parts = key.split("IFNA:")[1].split("/");
if (parts.length != 2 || !parts[0].matches("\\d+")) {
throw new RuntimeException("500000エラー: " + key + " のIFNAパターンが不正です");
}
if (key.contains("/*")) {
int replacementValue = Integer.parseInt(parts[0]);
return (value == null || value.isEmpty()) ? String.valueOf(replacementValue) : value;
} else {
if (!parts[1].matches("\\d+")) {
throw new RuntimeException("500000エラー: " + key + " のIFNAパターンが不正です");
}
int nullValueReplacement = Integer.parseInt(parts[0]);
int nonNullValueReplacement = Integer.parseInt(parts[1]);
return (value == null || value.isEmpty()) ? String.valueOf(nullValueReplacement) : String.valueOf(nonNullValueReplacement);
}
}