![Kann mit sed eine Ladedatei für meine Faktentabelle zur Datumssuche generiert werden?](https://rvso.com/image/23958/Kann%20mit%20sed%20eine%20Ladedatei%20f%C3%BCr%20meine%20Faktentabelle%20zur%20Datumssuche%20generiert%20werden%3F.png)
Ich habe eine SQL-Faktentabelle, die zum Nachschlagen eines Datums und Zurückgeben eines anderen Datums verwendet wird.
Das Tabellenschema ist wie folgt:
TABLE date_lookup
(
pk_date DATE,
plus1_months DATE,
plus2_months DATE,
plus3_months DATE
);
UNIQUE INDEX on date_lookup(pk_date);
Ich habe eine Ladedatei (durch Pipe-Getrennt) mit Daten vom 28.01.2012 bis 31.03.2014.
Nachfolgend sehen Sie ein Beispiel für die Ladedatei:
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|
Die Regeln für diese Faktentabelle sind:
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.
Meine Frage lautet: Ist es möglich, sed
mit den oben genannten Regeln für meine Ladedatei weitere Daten nach dem 31.03.2014 zu generieren, oder muss ich hierfür ein Programm schreiben?
Antwort1
Ich bezweifle, dass dies sed
in diesem Fall das richtige Werkzeug für diese Aufgabe ist. Ich denke, Sie möchten wahrscheinlich verwenden awk
, wenn Sie bereits mit vertraut sind awk
, andernfalls schreiben Sie ein Programm.
Ich kenne einen Ingenieur, der sed
und awk
zur Erstellung von MSC/NASTRAN-Eingabedateien verwendet hat, für die sogar noch strengere Anforderungen galten als die von Ihnen genannten, aber er war mit den Tools gut vertraut, sodass ihn kryptische und nichtssagende Fehlermeldungen von awk
nicht störten.
Wenn Sie dies mit tun möchten awk
, würde ich Ihnen raten, die Eingabe vorzuverarbeiten, um die Zeichen '-' und '|' zu entfernen. Schreiben Sie das awk
Programm in eine separate Datei. Verwenden Sie Textfeldpositionen ($1, $2, $3...) und schreiben Sie SQL INSERT-Anweisungen für die Ausgabe. Es wird mehrere Versuche erfordern, also automatisieren Sie so viel wie möglich.
Antwort2
Obwohl es technisch möglich ist, Datumsarithmetik in sed durchzuführen, ist es für diese Aufgabe überhaupt nicht das richtige Tool. Verwenden Sie ein Tool wie awk oder Perl, das über integrierte Ganzzahlarithmetik verfügt.
Ihre Anforderung ist ungewöhnlich für Datumsmanipulationen, daher benötigen Sie eine umfangreiche Bibliothek zur Datumsmanipulation, wenn Sie die Datumsarithmetik nicht hartcodieren möchten. PerlsDate::Manip
hat Funktionen wie 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";
}