目次
前
次
スクリプト作成
EEPROMから吸い上げたデータが、2019年6月1日0時0分から
始まるときがあります。
06/01,00:00,21,29,30,692
06/01,00:02,21,30,31,692
06/01,00:04,21,30,30,692
06/01,00:06,21,29,30,692
06/01,00:08,21,30,30,692
06/01,00:10,20,30,30,692
06/01,00:12,20,30,30,692
06/01,00:14,20,29,29,692
06/01,00:16,21,29,29,692
06/01,00:18,20,29,30,692
06/01,00:20,20,29,30,692
温度計測装置の電池交換後、端末ソフトで年月日時分を
入力できるようにスケッチを組んでいますが、この操作
ができないことがあります。
データ処理スクリプトを作成し、月日時分を修正する
ことを考えました。
月日時分を修正するスクリプトは、以下。
function getValue(x)
{
result = 0
if ( x == "1" ) { result = 1 }
if ( x == "2" ) { result = 2 }
if ( x == "3" ) { result = 3 }
if ( x == "4" ) { result = 4 }
if ( x == "5" ) { result = 5 }
if ( x == "6" ) { result = 6 }
if ( x == "7" ) { result = 7 }
if ( x == "8" ) { result = 8 }
if ( x == "9" ) { result = 9 }
if ( x == "A" ) { result = 10 }
if ( x == "B" ) { result = 11 }
if ( x == "C" ) { result = 12 }
if ( x == "D" ) { result = 13 }
if ( x == "E" ) { result = 14 }
if ( x == "F" ) { result = 15 }
return result
}
{
if ( $1 != "FF" && $9 != "FF" ) {
for ( i = 1 ; i < 17 ; i++ ) {
if ( i == 1 || i == 9 ) {
cur = $i + 5
printf("%02d/",cur)
}
if ( i == 2 || i == 10 ) {
cur = $i + 6
printf("%02d,",cur)
}
if ( i == 3 || i == 11 ) {
cur = $i + 15
cur = cur % 24
printf("%02d:",cur)
}
if ( i == 4 || i == 12 ) {
cur = $i + 50
cur = cur % 60
printf("%02d,",cur)
}
if ( 4 < i && i < 8 ) { printf("%s,",$i) }
if ( 12 < i && i < 16 ) { printf("%s,",$i) }
if ( i == 8 || i == 16 ) {
num = getValue(substr($i,1,1)) * 16 + getValue(substr($i,2,1))
printf("%d\n",4*num)
}
}
}
}
使い方は、以下。
このスクリプトは、計測開始の月日時分を記録して
おいて、一部を変更して利用します。
本スクリプトで、月日時分を修正すると、以下。
06/01,11:12,21,29,30,692
06/01,11:14,21,30,31,692
06/01,11:16,21,30,30,692
06/01,11:18,21,29,30,692
06/01,11:20,21,30,30,692
06/01,11:22,20,30,30,692
06/01,11:24,20,30,30,692
06/01,11:26,20,29,29,692
06/01,11:28,21,29,29,692
06/01,11:30,20,29,30,692
06/01,11:32,20,29,30,692
これで、ある程度までは修正できますが、時を更新
できないことがありました。
分の58を検出して、そのレコードと次レコードの時が
同じであれば、次レコードの時を+1するスクリプト
を書きます。
58を検出したレコードか次レコードかをフラグを
用意して判断するようにすれば、次のスクリプト
ができました。
BEGIN {
FS = ","
}
{
tarx = $2
flag = 0
if ( substr(tarx,4,2) == "58" ) {
pre = substr(tarx,1,2)
# this record
flag = 1
}
car = substr(tarx,1,2)
cdr = substr(tarx,4,2)
result = $2
if ( pre == car && flag == 0 ) {
car = (car+1) % 24
# generate 2 charactor
if ( car < 10 ) { car = "0" car }
# concatenate
result = car ":" cdr
}
printf("%s,%s,%s,%s,%s,%s\n",$1,result,$3,$4,$5,$6)
}
使うときは、パイプを利用して、次のようにタイプ。
gawk -f cv.awk xdat.txt | gawk -f cy.awk > xdatx.txt
時を処理するスクリプトでは、0から23の間に
なるように、剰余系を使っています。
時は、2けたの10進数で表現するので
10より小さい値のときには、0を前に
つけて対応。
測定データが2日以上になると、日付がずれる
不具合が出たので、さらにスクリプトを使って
補正することに。
時分が23:58と00:00のときの日付が同じなら
00:00の日付は、日を+1します。
テキストエディタで一気に変換すると、漏れて
しまうことがあるので、このアルゴリズムにて
対応。
スクリプトは、以下。
BEGIN {
FS = ","
}
{
tarx = $2
flag = 0
if ( tarx == "23:58" ) {
pre = $1
# this record
flag = 1
}
car = substr($1,1,2)
cdr = substr($1,4,2)
result = $1
if ( pre == $1 && flag == 0 ) {
# ? odd or even
man = car % 2
# odd
if ( man == 1 ) {
cdr = (cdr+1) % 32
}
# even without Feb
if ( man == 0 && car != 2 ) {
cdr = (cdr+1) % 31
}
# Feb
if ( man == 0 && car == 2 ) {
cdr = (cdr+1) % 29
}
# generate 2 charactor
if ( cdr < 10 ) { cdr = "0" cdr }
# concatenate
result = car "/" cdr
}
printf("%s,%s,%s,%s,%s,%s\n",result,$2,$3,$4,$5,$6)
}
このスクリプトでも、完璧ではないですが
テキストエディタ利用で、一部を補正して
対応することにします。
使うときは、パイプを利用。
gawk -f cv.awk xdat.txt | gawk -f cy.awk | gawk -f cz.awk > xdatx.txt
日照値を換算日照値にして、グラフがわかりやすく
なるようにするため、2つのスクリプトを一部改定
しました。
cy.awkは、フィールド$5、$6の間に換算日照値を
挟み込んでいきます。
#
# cy.awk
#
BEGIN {
FS = ","
}
{
#
tarx = $2
flag = 0
if ( substr(tarx,4,2) == "58" ) {
pre = substr(tarx,1,2)
# this record
flag = 1
}
#
car = substr(tarx,1,2)
cdr = substr(tarx,4,2)
result = $2
if ( pre == car && flag == 0 ) {
car = (car+1) % 24
# generate 2 charactor
if ( car < 10 ) { car = "0" car }
result = car ":" cdr
}
# generate calculated value
xx = int( $6 / 20)
# show
printf("%s,%s,%s,%s,%s,%s,%s\n",$1,result,$3,$4,$5,xx,$6)
}
cz.awkは、パイプでcy.awkの生成したテキストを
処理するので、こちらもフィールド$5、$6の間に
換算日照値を挟み込みます。
#
# cz.awk
#
BEGIN {
FS = ","
}
{
tarx = $2
flag = 0
if ( tarx == "23:58" ) {
pre = $1
# this record
flag = 1
}
car = substr($1,1,2)
cdr = substr($1,4,2)
result = $1
if ( pre == $1 && flag == 0 ) {
# ? odd or even
man = car % 2
# odd
if ( man == 1 ) { cdr = (cdr+1) % 32 }
# even without Feb
if ( man == 0 && car != 2 ) { cdr = (cdr+1) % 31 }
# Feb
if ( man == 0 && car == 2 ) { cdr = (cdr+1) % 29 }
# generate 2 charactor
if ( cdr < 10 ) { cdr = "0" cdr }
# concatenate
result = car "/" cdr
}
printf("%s,%s,%s,%s,%s,%s,%s\n",result,$2,$3,$4,$5,$6,$7)
}
目次
前
次