VectorのCANapeやCANoeで取得したMDFファイル(MF4ファイル)をpythonの
mdfreaderとpandasを使うことで、csv化することができます。
CANデータをcsv化して自動化したい方は必見です!
pythonのmdfreaderとpandasを連携させてMDFファイルを読み込む

まずは、pythonのインストールが必要です。
下記記事の中でわかりやすく紹介しているのでインストールをしましょう
pythonでMDFファイルを使う準備
mdfreaderのinstallが必要となるため、cmdを起動して
下記内容をコピペで貼り付けしましょう!
>>pip install mdfreader
他に必要なものも全て一緒にインストールしてくれます。
※もしインストールのときにbitarrayのインストールでerrorが出た場合は、
下記リンク先の情報が勉強になりました。
エラーに書いてある通り「Visual C++ Build Tools 」をインストールすることで解決しました。

使い方
① レコーディングしたシグナル一覧を抽出する
② csv化したいシグナルの一覧を作成する
③ 対象のシグナルをcsv化する
レコーディングしたシグナル一覧を抽出する
下記内容で抽出できます。
mdfreaderをインスタンス化して、list_channelsに渡すことで抽出できます。
これをcsvで書き出します。
# -*- coding: utf-8 -*-
import pandas as pd
import mdfreader
def mf4_all_signal_list(fname):
yop = mdfreader.MdfInfo()
df = pd.DataFrame(yop.list_channels(fname))
df.to_csv("list.csv")
if __name__ == "__main__":
fname = "Demo.mf4"
mf4_all_signal_list(fname)
csv化したいシグナルの一覧を作成する
csv化したいシグナル一覧を作成するために1つcsvファイルを作成しましょう。
その中に、上記で抽出したシグナルの中から、書き出ししたいシグナルをcsvに書き足していきます。

最終的には、読み込んだmdfreaderインスタンスのchannel_listの引数として
下記のようなlist形式で読み込ませる必要があります。
[‘sample_signal_1’, ‘sample_signal_2’]
>>inst = mdfreader.Mdf(fname, channel_list=signal_name, convert_after_read=False, metadata=2)
# -*- coding: utf-8 -*-
def Target_list(fname):
list_data = pd.read_csv(fname).values.tolist()
list_data = [flatten for inner in list_data for flatten in inner]
print(list_data)
return list_data
if __name__ == "__main__":
signal_list = Target_list("list.csv")
5行目の内包表現をつかうことで、書き出ししたいシグナルリストをうまく
既定のlistフォーマットにすることができます。

対象のシグナルをcsv化する
下記で対象となるMDF(MF4)ファイルを読み込み sampling周期を0.01[s]でdataframe化します。
>>inst = mdfreader.Mdf(ファイル名, channel_list=シグナルリスト, convert_after_read=False, metadata=2)
>>df = inst.convert_to_pandas(sampling=0.01)
※ちなみにおまけ情報ですが、下記でMDFに記録されたコメントも書き出すことができます。
>>text = inst.fileMetadata[‘comment’]
# -*- coding: utf-8 -*-
import pandas as pd
import mdfreader
def mf4_all_signal_list(fname):
yop = mdfreader.MdfInfo()
df = pd.DataFrame(yop.list_channels(fname))
df.to_csv("list.csv")
def Target_list(fname):
list_data = pd.read_csv(fname).values.tolist()
list_data = [flatten for inner in list_data for flatten in inner]
print(list_data)
return list_data
def mf4_to_csv(fname, signal_name):
inst = mdfreader.Mdf(fname, channel_list=signal_name, convert_after_read=False, metadata=2)
df = inst.convert_to_pandas(sampling=0.01)
df.to_csv(fname+".csv")
# ついでにMDFに記録されたコメントも書き出す
text = inst.fileMetadata['comment']
print (text,file=codecs.open(fname+".txt", 'w', 'utf-8'))
if __name__ == "__main__":
fname = "Demo.mf4"
# mf4_all_signal_list(fname)
signal_list = Target_list("list.csv")
mf4_to_csv(fname, signal_list)
これで以上になります。
質問はTwitterから受け付けていますので、お気軽にどうぞ
>>pythonで生き延びる社畜(@coin_python) | Twitter
ラジオ放送でもエンジニアについて熱く語っています。こちらもお楽しみください
>>社畜戦士のエンジニアを熱く語るラジオ | stand.fm
同じくVector製品のblfファイルもcsv化してみる
プログラミング学習者へのオススメ記事
エンジニア志望者へのオススメ記事