我正在编写一个Python脚本,将.DBC
文件转换为.CSV
。
我搜索了很多库来帮助我,但都没有成功。有人知道在此转换任务中可能有用的选项/软件包吗?
答案 0 :(得分:1)
我不知道进行实际转换的任何内容,但是假设您是说DBC BUS格式,那么有一个Python库可以读取:https://pypi.org/project/cantools/
Python具有内置的用于编写CSV的工具:https://docs.python.org/3/library/csv.html
只需几行就可以将这些库组合成一个转换器。
答案 1 :(得分:1)
将其转换为XLS(Microsoft Excel),从那里可以将其转换为.csv,我是ubuntu家伙,但我认为应该有导出选项。或至少在LibreOffice中有
答案 2 :(得分:0)
我真的不明白为什么有些成员对问题给出-1,但并没有真正回答。
好吧,我还没有找到将.DBC
转换为.CSV
的好库。
但是我可以使用Python + R做到这一点,我在这里分享我的实现方式。
下面的Python脚本获取R路径并执行dbc2csv.R
文件,并发送三个arg:原始文件路径,转换后的文件路径以及将要转换的文件名。
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进行转换会更好。 但是这种方法会很好用。
答案 3 :(得分:0)
如果您在Linux上使用python,则替代方法之一是使用位于此存储库中的项目:https://github.com/greatjapa/dbc2csv
通过创建一个运行bash脚本和python脚本的docker来工作(您也可以在不使用docker的情况下单独运行它们,并且效果也一样)。
还值得注意的是,Datasus使用的.dbc扩展名是他们自己创建的扩展名(与cantools和其他此类工具使用的.dbc不相关),这只会使它难以使用。
答案 4 :(得分:0)
在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
希望这可能对某人有帮助!