業務上、連続でデータを取る→CSVファイルに書き込んでログを取る、という作業が多かったので
備忘録的にまとめてみました。
環境
OS:Raspbian Buster 10
使用ソフト:Code-OSS(headmelted) 1.44.0
プログラムの流れ
プログラムと同じ階層に空のCSVファイルを作成し、そこにログを書き込んでいきます。
『西暦/月/日 時:分:秒,(データ1),(データ2)...』という風に、日付を最初に付けて、
記録したいデータを後ろにカンマ区切りで羅列していきます。
Python
csvWrite.py
import csv
import datetime
n = 0
try:
with open('logger.csv', 'a') as f:
# ログを10回書き込む
while n < 10:
# 日付・時刻
now = datetime.datetime.now()
nowTime = '{0:%Y/%m/%d %H:%M:%S}'.format(now)
# データ群
data1 = 'data1'
data2 = 'data2'
data3 = 'data3'
writeStr = nowTime + ',' + data1 + ',' + data2 + ',' +data3
writeStr = writeStr.split(',')
# 書き込んだ文字列の確認
# 例:'2020/03/06 15:00:00','data1','data2','data3'
print('writeStr = %s' % writeStr)
writer = csv.writer(f, quoting=csv.QUOTE_NONNUMERIC)
writer.writerow(writeStr)
n += 1
except FileNotFoundError as e:
print(e)
except csv.Error as e:
print(e)
C言語
csvWrite.c
#include <stdio.h>
#include <time.h>
FILE *fp;
char *fname = "logger.csv";
struct tm tm;
int main(void)
{
struct tm tm;
time_t t;
// データ群
char data1[] = "data1";
char data2[] = "data2";
char data3[] = "data3";
// ファイルを開く(無い場合は自動で作成される)
fp = fopen(fname, "a");
if(fp == NULL){
printf("file can't open¥n");
return -1;
}
// ログを10回書き込む
for(int n = 0; n < 10; n++){
// 日付・時刻
t = time(NULL);
localtime_r(&t, &tm);
fprintf(fp, "\"%04d/%02d/%02d %02d:%02d:%02d\",",
tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
tm.tm_hour, tm.tm_min, tm.tm_sec);
fprintf(fp, "\"%s\",\"%s\",\"%s\"\n", data1, data2, data3);
// 書き込んだ文字列の確認
// 例:"2020/03/06 15:00:00","data1","data2","data3"
printf("writeStr = \"%04d/%02d/%02d %02d:%02d:%02d\",\"%s\",\"%s\",\"%s\"\n",
tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
tm.tm_hour, tm.tm_min, tm.tm_sec, data1, data2, data3);
}
fclose(fp);
return 0;
}
まとめ
IoT開発をしているとサーバーにログを残したりするのですが、インターネットに接続できなかった場合に
その間のログが消えた時の絶望感がすごいので、SDカードにCSVファイルを作ってこうしてこまめに保存できたらいいなと思います。