【完全版】pythonでMDFファイルのCANデータをcsv化する

python サンプル学習
この記事は約7分で読めます。

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 」をインストールすることで解決しました。

python pip実行時に「error: Microsoft Visual C++ 14.0 is required. Get it with “Build Tools for Visual Studio”」が発生した場合の対処法

使い方

① レコーディングしたシグナル一覧を抽出する
② 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化してみる

プログラミング学習者へのオススメ記事

エンジニア志望者へのオススメ記事

タイトルとURLをコピーしました