如何使用cyphr包加密SPSS(.sav)文件?遇写入规则缺失报错
关于cyphr包加密SPSS .sav文件的问题解答
问题原因
cyphr默认不支持直接加密/解密SPSS的.sav文件,因为它没有内置haven::write_sav(用于保存.sav文件的函数)的重写规则,这就是你遇到以下错误的直接原因:
Error in db_lookup(dat$ns, dat$name, file_arg) :
Rewrite rule for haven::write_sav not found
解决方案
有两种可行的处理方式:
1. 直接加密整个.sav文件(简单通用)
使用cyphr的encrypt_file()和decrypt_file()函数直接对.sav文件进行整体加密/解密,不需要依赖haven的读写函数:
# 加密.sav文件 cyphr::encrypt_file("原始数据.sav", "加密后数据.sav.encrypted", key = your_key) # 解密并读取 cyphr::decrypt_file("加密后数据.sav.encrypted", "临时解密数据.sav", key = your_key) data <- haven::read_sav("临时解密数据.sav") # 记得用完删除临时文件 file.remove("临时解密数据.sav")
2. 自定义cyphr的重写规则(支持无缝读写)
手动为haven::write_sav和haven::read_sav添加cyphr的重写规则,这样就能像处理.csv文件一样直接加密/解密.sav文件:
# 注册write_sav的加密规则 cyphr::db_register( ns = "haven", name = "write_sav", fun = function(con, ...) { haven::write_sav(..., path = con) }, encrypt = TRUE ) # 注册read_sav的解密规则 cyphr::db_register( ns = "haven", name = "read_sav", fun = function(con, ...) { haven::read_sav(file = con, ...) }, decrypt = TRUE ) # 现在可以直接使用encrypt/decrypt流程 cyphr::encrypt(haven::write_sav(data, "加密数据.sav"), key = your_key) decrypted_data <- cyphr::decrypt(haven::read_sav("加密数据.sav"), key = your_key)
注意:自定义规则需要自行测试验证读写逻辑的正确性,避免数据损坏。
内容的提问来源于stack exchange,提问作者Dierforth
相关产品推荐
相关产品推荐

