使用 python 将 .dbc 文件转换为 .csv

Convert .dbc files into .csv with python

我正在编写一个 python 脚本来将 .DBC 个文件(来自 Datasus)转换为 .CSV

我搜索了很多库来帮助我,但没有一个成功。有人知道在这个转换任务中可能有用的 option/package 吗?

我不知道有什么可以进行实际转换的,但假设您指的是 DBC BUS 格式,那么有一个 Python 库可以读取:https://pypi.org/project/cantools/

并且 Python 具有用于编写 CSV 的内置工具:https://docs.python.org/3/library/csv.html

只需几行代码即可将这些库组合成一个转换器。

将其转换为 XLS (microsoft excel),然后您可以将其转换为 .csv,我是 ubuntu,但我相信应该有一个导出选项。或者至少在 LibreOffice

中有

我真的不明白为什么有些会员给问题打了-1,却没有真正回答。

好吧,我还没有找到一个好的库来将 .DBC 转换为 .CSV。 但是我可以使用 Python + R 来完成,我在这里分享我是如何实现的。

下面的Python脚本获取R路径并执行dbc2csv.R文件发送三个参数:原始文件路径、转换后的文件路径和将要转换的文件名。

import subprocess
import commands


def dbc2csv(raw_filename):
dbc2csv_path = "/path/to/script/dbc2csv.R " + raw_files_dir + " " + converted_files_dir + " " + raw_filename

try:
    r_script_path = commands.getstatusoutput('which Rscript')[1]
    subprocess.call(r_script_path + " --vanilla " + dbc2csv_path, shell=True)
    return True
except:
    print("(Rscript) Error converting file: " + raw_filename)

return False

下面的R脚本dbc2csv.R实际上就是谁来转换。

#install.packages("read.dbc") You need this package
library("read.dbc")


dbc2dbf <- function(rawDir, convertedDir, file) {
    # reads dbc file
    x <- read.dbc(paste(rawDir, file, sep=""))
    # write it to csv
    write.csv(x, file=paste(convertedDir, file, ".csv", sep=""))
}

args = commandArgs(trailingOnly=TRUE)
try(dbc2dbf(args[1], args[2], args[3]), TRUE)

我们确实知道如果我们可以仅使用 Python 进行转换会更好。 但这种方法会很好用。

如果您在 Linux 上使用 python,备选方案之一是使用位于此存储库中的项目:https://github.com/greatjapa/dbc2csv

它的工作原理是创建一个 docker,运行 是 bash 脚本,然后是 python 脚本(您也可以 运行 它们分开,不使用 docker,这同样有效。

还值得注意的是,Datasus 使用的 .dbc 扩展名是他们自己创建的(与 cantools 和其他此类工具使用的 .dbc 无关),这只会让使用起来很痛苦。

在 python 中有这个很棒的库 https://pypi.org/project/cantools/

您可以查看它的源代码来找到您需要提取的字段:https://github.com/eerimoq/cantools/tree/f120d35e1523201b6d87e87306457bf1769330e3

消息和信号的所有相关字段都可以在 cantools/database/can/message.py 和 /database/can/signal.py 中找到 github link

例如:如果您需要名称和信号单位,您可以使用 signal.name 和 signal.unit

提取这些字段的示例代码:

 #**dbc_file** is the full path of dbc 
    db = cantools.database.load_file(dbc_file)
    for msg in db.messages:
        msg_name = msg.name
        msg_id = msg.frame_id
        msg_length = msg.length
        sender = msg.senders
        msg_group = db.get_message_by_name(msg_name)
    
        for signal in msg_group.signals:
            
            #name of signal
            sig_name = signal.name
            #unit of signal
            sig_unit = signal.unit

希望这可能对某人有所帮助!!