【发布时间】:2019-02-13 01:26:59
【问题描述】:
我正在编写一个 python 脚本来将 .DBC 文件(来自 Datasus)转换为 .CSV。
我搜索了很多库来帮助我,但都没有成功。有人知道在此转换任务中可能有用的选项/包吗?
【问题讨论】:
我正在编写一个 python 脚本来将 .DBC 文件(来自 Datasus)转换为 .CSV。
我搜索了很多库来帮助我,但都没有成功。有人知道在此转换任务中可能有用的选项/包吗?
【问题讨论】:
我真的不明白为什么有些会员给这个问题-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 进行转换会更好。 但是这种方法会很好用。
【讨论】:
在 python 中有这个很棒的库https://pypi.org/project/cantools/
您可以通过它的源代码找到需要提取的字段:https://github.com/eerimoq/cantools/tree/f120d35e1523201b6d87e87306457bf1769330e3
消息和信号的所有相关字段都可以在此 github 链接的 cantools/database/can/message.py 和 /database/can/signal.py 中找到
例如:如果您需要信号的名称和单位,您可以使用 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
希望这可能对某人有所帮助!
【讨论】:
我不知道任何可以进行实际转换的东西,但假设您指的是 DBC BUS 格式,有一个 Python 库可以读取:https://pypi.org/project/cantools/
而且 Python 有用于编写 CSV 的内置工具:https://docs.python.org/3/library/csv.html
只需几行代码就可以将这些库组合成一个转换器。
【讨论】:
将其转换为 XLS(microsoft excel),然后您可以将其转换为 .csv,我是 ubuntu 人,但我相信应该有一个导出选项。或者至少在 LibreOffice 中有
【讨论】:
如果您在 Linux 上使用 python,其中一种选择是使用位于此存储库中的项目:https://github.com/greatjapa/dbc2csv
它的工作原理是创建一个 docker 运行 bash 脚本,然后运行 python 脚本(您也可以单独运行它们,而不使用 docker,这也可以)。
还值得注意的是,Datasus 使用的 .dbc 扩展名是他们自己创建的(与 cantools 和其他此类工具使用的 .dbc 无关),这只是让它使用起来很痛苦。
【讨论】: