使用 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
希望这可能对某人有所帮助!!
我正在编写一个 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
希望这可能对某人有所帮助!!