目次

スクリプト作成

 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)
}


目次

inserted by FC2 system