4

我不小心删除了我的联系人,我没有备份,现在我得到了contacts2.db,我正试图将.db 转换为.vcf。现在我正在使用 Ruby 来转换文件,这就是我所做的

gem install sqlite3
gem install vpim
path to contacts2-to-vcard.rb/contacts2-to-vcard.rb > contacts.vcf

我总是说“拒绝访问”。而且我将文件夹设置为完全控制,但是每当我运行该命令时,它都会更改为只读,顺便说一下我使用的是 Windows 8。有帮助吗?或者是否有其他为什么将 .db 转换为 .vcf 的原因?TIA

4

3 回答 3

2

将其从数据库中拉出(这一切都在 Ruby 中):

require 'sqlite3'

path_to_contactsdb_file = "/SAMPLE/PATH/TO/contacts2.db"

db = SQLite3::Database.new path_to_contactsdb_file

raw_contacts = db.execute("select _id,display_name from raw_contacts")
contacts = {}
raw_contacts.each do |x|
   contacts[x[1]] = {}
   contacts[x[1]]['rcid'] = x[0]
   contacts[x[1]]['nums'] = db.execute("select normalized_number from phone_lookup where raw_contact_id=" + x[0].to_s)
end

将其拉到 CSV:

output_filepath = "/SAMPLE/EXAMPLE/FILEPATH"    

csv = ""
contacts.each do |k,v|
 csv += '"' + k + '",'
  v['nums'].each do |num|
    csv += '"' + num[0] + '",'
  end
  csv += "\n"
end

File.open(output_filepath,"w") {|file| file.write(csv) }

然后你可以使用一个 CSV 导入应用程序,通过谷歌联系人导入通过 CSV 等等。你可以给我一个水果篮。

如果它必须是 VCF 格式,那么只需更改 CSV 的输出语法。查找一个示例 VCF 文件,我不会被打扰。

于 2013-10-18T00:32:43.973 回答
1

我一直在尝试使用 Dustin van Schouwen 的代码来完成这项任务。首先,我想感谢他,然后提到一些我需要添加/更改以使其对我有用的细节:

这一行:

db = SQLite3::Database.new path_to_contactsdb_file

我改为:

db = SQLite3::Database.new ("contacts2.db")

与使用前一个时一样,即使它没有给出错误,它似乎也没有真正连接到数据库(我认为它会创建一个空的)。

我需要做的另一个改变是在另一行:

csv += '"' + k + '",

如果 "k" 为 nil,代码将失败,所以我引入了一个 if(三元语法)来解决它,它运行良好:

csv += '"' + (k == nil ? "" : k) + '",'
于 2013-10-25T00:45:21.843 回答
0

抱歉,OP 有点晚了。无论如何,我无法提供有关 ruby​​ 的提示。

但是在为自己的需求寻找解决方案时,我偶然发现了这里。
我终于想出了一个 python 解决方案:
https
://gitlab.com/Arnaudv6/contacts2.db-2-vcard 基于上页记录的以前的作品。

请参阅脚本开头的“待办事项”部分以
获取有关迄今为止尚未实施的详细信息。

于 2021-09-07T17:33:43.800 回答