【问题标题】:How to search a .dbc file for a specified string如何在 .dbc 文件中搜索指定的字符串
【发布时间】:2022-01-14 04:53:22
【问题描述】:

我正在开发一个从 *.dbc 文件中读取信息的 python 程序

dbc_path_in = Path(path, dbc_directory)
dbc_files = {"CAN": [(dbc, 0) for dbc in list(dbc_path_in.glob("*" + ".dbc"))]}
print("dbc_files = " + str(dbc_files))

我要读取的 dbc 文件格式如下:

BO_ 2024 OBD2: 8 Vector__XXX
 SG_ S1_PID_00_PIDsSupported_01_20 m0 : 31|32@0+ (1,0) [0|4294967295] "" Vector__XXX
 SG_ S1_PID_01_MonitorStatus m1 : 31|32@0+ (1,0) [0|4294967295] "" Vector__XXX
 SG_ S1_PID_02_FreezeDTC m2 : 31|16@0+ (1,0) [0|65535] "" Vector__XXX
 SG_ S1_PID_03_FuelSystemStatus m3 : 31|16@0+ (1,0) [0|65535] "" Vector__XXX
 SG_ S1_PID_04_CalcEngineLoad m4 : 31|8@0+ (0.39216,0) [0|100] "%" Vector__XXX
 SG_ S1_PID_05_EngineCoolantTemp m5 : 31|8@0+ (1,-40) [-40|215] "degC" Vector__XXX
 SG_ S1_PID_06_ShortFuelTrimBank1 m6 : 31|8@0+ (0.78125,-100) [-100|99.21875] "%" Vector__XXX
 SG_ S1_PID_07_LongFuelTrimBank1 m7 : 31|8@0+ (0.78125,-100) [-100|99.21875] "%" Vector__XXX
 SG_ S1_PID_08_ShortFuelTrimBank2 m8 : 31|8@0+ (0.78125,-100) [-100|99.21875] "%" Vector__XXX
 SG_ S1_PID_09_LongFuelTrimBank2 m9 : 31|8@0+ (0.78125,-100) [-100|99.21875] "%" Vector__XXX
 SG_ S1_PID_0A_FuelPressure m10 : 31|8@0+ (3,0) [0|765] "kPa" Vector__XXX
 SG_ S1_PID_0B_IntakeManiAbsPress m11 : 31|8@0+ (1,0) [0|255] "kPa" Vector__XXX
 SG_ S1_PID_0C_EngineRPM m12 : 31|16@0+ (0.25,0) [0|16383.75] "rpm" Vector__XXX
 SG_ S1_PID_0D_VehicleSpeed m13 : 31|8@0+ (1,0) [0|255] "km/h" Vector__XXX

我如何在 dbc_files 中搜索以下字符串 CM_ SG_ 并将后面的名称存储在一个数组中,例如

array = {"PIDsSupported", "MonitorStatus", "FreezeDTC",  ... etc} 

【问题讨论】:

    标签: python can-bus


    【解决方案1】:

    应该这样做

    matched_strings = []
    for i in dbc_files["CAN"]:
        with open(i[0], "r") as f:
            for line in f.readlines():
                if ("CM_" in line):
                    matched_strings.append(line.split("CM_",1)[1])
                elif ("SG_" in line):
                    matched_strings.append(line.split("SG_",1)[1])
    

    我假设您希望匹配“CM_”或“SG_”,而不是问题中所述的“CM_SG_”。如果要具体匹配“CM_SG_”:

    matched_strings = []
    for i in dbc_files["CAN"]:
        with open(i[0], "r") as f:
            for line in f.readlines():
                if ("CM_ SG_" in line):
                    matched_strings.append(line.split("CM_",1)[1])
    
    

    【讨论】:

      【解决方案2】:
      new_string = str(dbc_files).split(' ')
      
      matched  = []
      
      for i ,string_ in enumerate(new_string):
          if string_ in ["CM_","SG_"]:
              matched.append(new_string[i+1].split('_')[3])
      
      print(matched)
      

      将返回:

      ['PIDsSupported', 'MonitorStatus', 'FreezeDTC', 'FuelSystemStatus', 'CalcEngineLoad', 'EngineCoolantTemp', 'ShortFuelTrimBank1', 'LongFuelTrimBank1', 'ShortFuelTrimBank2', 'LongFuelTrimBank2', 'FuelPressure', 'IntakeManiAbsPress', 'EngineRPM', 'VehicleSpeed']
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-01-22
        • 2023-03-17
        • 1970-01-01
        • 2020-07-17
        • 2021-08-30
        • 1970-01-01
        • 2012-05-07
        相关资源
        最近更新 更多