![sed 可以用來為我的日期查找事實表產生載入檔嗎?](https://rvso.com/image/23958/sed%20%E5%8F%AF%E4%BB%A5%E7%94%A8%E4%BE%86%E7%82%BA%E6%88%91%E7%9A%84%E6%97%A5%E6%9C%9F%E6%9F%A5%E6%89%BE%E4%BA%8B%E5%AF%A6%E8%A1%A8%E7%94%A2%E7%94%9F%E8%BC%89%E5%85%A5%E6%AA%94%E5%97%8E%EF%BC%9F.png)
我有一個 SQL 事實表,用於查找日期並返回另一個日期。
表架構如下:
TABLE date_lookup
(
pk_date DATE,
plus1_months DATE,
plus2_months DATE,
plus3_months DATE
);
UNIQUE INDEX on date_lookup(pk_date);
我有一個載入檔案(以垂直線分隔),其中包含從 01-28-2012 到 03-31-2014 的日期。
以下是載入文件的範例:
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
並awk
創建 MSC/NASTRAN 輸入文件,其要求比您提到的更嚴格,但他對這些工具非常熟悉,因此來自的神秘且無資訊的錯誤訊息並沒有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";
}