sedを使用して日付照会ファクト表のロードファイルを生成できますか?

sedを使用して日付照会ファクト表のロードファイルを生成できますか?

日付を照会して別の日付を返すSQLファクト表があります。

テーブル構造は次のとおりです。

TABLE date_lookup
   (
pk_date DATE,
plus1_months DATE,
plus2_months DATE,
plus3_months DATE
   );

UNIQUE INDEX on date_lookup(pk_date);

2012年1月28日から2014年3月31日までの日付を含むロードされたファイル(パイプ区切り)があります。

以下は、ファイルをロードする例です。

01-28-2012|02-28-2012|03-28-2012|04-28-2012|

01-29-2012|02-29-2012|03-29-2012|04-29-2012|

01-30-2012|02-29-2012|03-30-2012|04-30-2012|

01-31-2012|02-29-2012|03-31-2012|04-30-2012|

...

03-31-2014|04-30-2014|05-31-2014|06-30-2014|

このファクトテーブルのルールは次のとおりです。

IF pk_date has more than 28 days in its month
AND plus1, plus2 or plus3_months only has 28, 29 or 30 days
THEN let plus1, plus2 or plus3 equal the last day of the following month. 

sed私の質問は次のとおりです。上記の規則に従って、ロードファイルに対して2014年3月31日以降にさらに日付を生成できますか?それともこれを行うプログラムを書く必要がありますか?

答え1

この場合、これがsed作業に適したツールであると思われます。awkすでに慣れている場合は使用し、awkそうでない場合はプログラムを書くことをお勧めします。

sed私はあなたが言及したよりも厳しい要件でMSC / NASTRAN入力ファイルを使用して生成するエンジニアを知っていますが、彼はこれらのツールに精通しているので、ツールから出てくる秘密でawk情報のないエラーメッセージはawk 彼を悩ませません。

を使用してこれを行うには、awk入力を前処理して "-"と "|"文字を削除することをお勧めします。プログラムをawk別のファイルに書き込みます。テキストフィールドの位置($1、$2、$3...)を使用し、出力用のSQL INSERT文を作成します。何度も試す必要があるので、できるだけ自動化してください。

答え2

sedで日付操作を実行することは技術的に可能ですが、作業に適したツールではありません。 awkやPerlなどの整数演算機能を備えたツールを使用してください。

あなたの要件は日付操作に固有であるため、日付算術をハードコードしないようにするには、豊富な日付操作ライブラリが必要です。真珠Date::Manip同様の機能がありますDate_DaysInMonth

#!/usr/bin/env perl
use strict;
use warnings;
use Date::Manip;
use List::Util qw(/./);
sub shift_month {
    my ($delta, $y, $m, $d) = @_;
    $m += $delta;
    $y += $m / 12;
    $m %= 12;
    return ($y, $m, min($d, Date_DaysInMonth($m, $y)));
}
my $next_day = ParseDateDelta("1 day");
my ($cur, $end) = (ParseDate($ARGV[0]), ParseDate($ARGV[1]));
while (Date_Cmp($cur, $end) < 0) {
    my @ymd = UnixDate($cur, qw(%Y %m %d));
    foreach my $i (0..3) {
        printf "%02d-%04d-%02d|", @{[shift_month($i, @ymd)]}[1, 0, 2];
    }
    $cur = DateCalc($cur, $next_day);
    print "\n";
}

関連情報