可能な限り動的/柔軟に.csvファイルから文字列データを解析できるようにするための助けが必要dd-MMM-yyyy
ですyyyy-MM-dd
.日付、または日時の、例外をスローしたりクラッシュしたりすることなく解析できるはずです。dd-MMM-yyyy
.csvファイルの日付/日時フィールドの現在の形式は、30-Apr-2020
. もちろん、時間を追加することができ、オプションです (パターンで見られるように、[ ] ブラケット表記を使用しているため、それは になります30-Apr-2020 23:59:59
)。私はすでに日付/日時列の解析を次のように設定しています:
DateTimeFormatter dtf = new DateTimeFormatterBuilder()
.appendPattern("dd-MMM-yyyy[[ ]['T']HH:mm:ss]")
.optionalStart()
.appendFraction(ChronoField.MICRO_OF_SECOND, 1, 6, true)
.optionalEnd()
.toFormatter();
TemporalAccessor temporalAccessor = dtf.parseBest(dateString, LocalDateTime::from, LocalDate::from);
if (temporalAccessor instanceof LocalDateTime) {
// process here
} else if (temporalAccessor instanceof LocalDate) {
// process here
}
したがって、基本的にパターンを柔軟に設定することによって、つまり"dd-MMM-yyyy[[ ]['T']HH:mm:ss]"
、TemporalAccessor を使用してそれが日付か日時かを確認し、必要に応じてさらに処理を行います。さまざまな種類の入力を処理でき、アプリがここで例外をスローして失敗することはありません。だから私は消費することができます:
01-Sep-2020 // just date
01-Sep-2099 18:59:59 // datetime
01-Apr-2033 18:59:59.123 // datetime with ms
01-Aug-2057 23:59:59.123456 // date time up to 6 ms decimal pts
ただし、ユーザー .csv に2020-05-30
日付のようなものが含まれている場合、これはISO形式の標準であると思われますが、失敗します。また、私が今気付いた悪い点は.parseBest()
、月の大文字と小文字が区別されるためにメソッドも失敗することです。つまり、このようなものは01-MAY-1999
失敗しますが、01-May-1999
合格します。
解析に失敗することなく、さまざまな種類のフォーマットを処理するにはどうすればよいですか? 私が言ったように、私は実際に .csv ファイル (つまりデータ エンジニア) を生成しないので、このアプリを可能な限り堅牢/柔軟にし、このデータを解析/正しくフォーマットして、データを消費できるようにしたいと考えています。それに応じてデータベースに書き込まれます。ここでの私のアプローチはまともだと思ったので、大規模な書き直しが必要ないことを望んでいました.