匿名化SQLite数据库?

匿名化SQLite数据库?,sql,sqlite,Sql,Sqlite,问题:我有一个包含名字、姓氏和性别列的表。我需要对数据库进行部分匿名化,方法是将此表中的所有名称替换为任意虚构的名称。我还有一个电子表格,上面有很多性别特有的任意名称 鉴于此,我如何遍历此表的行,并用电子表格中的名称依次替换每个名称 我可以用C语言完成这项工作,但这需要几天的时间——将电子表格导出为CSV,然后遍历表中的行,用CSV文件中的下一个名称更新每个名称。然而,我忍不住觉得有一种更简单的方法可以通过将CSV名称数据转换为脚本来实现这一点,但我不知道如何从脚本迭代表。任何建议/想法都值得赞

问题:我有一个包含名字、姓氏和性别列的表。我需要对数据库进行部分匿名化,方法是将此表中的所有名称替换为任意虚构的名称。我还有一个电子表格,上面有很多性别特有的任意名称

鉴于此,我如何遍历此表的行,并用电子表格中的名称依次替换每个名称


我可以用C语言完成这项工作,但这需要几天的时间——将电子表格导出为CSV,然后遍历表中的行,用CSV文件中的下一个名称更新每个名称。然而,我忍不住觉得有一种更简单的方法可以通过将CSV名称数据转换为脚本来实现这一点,但我不知道如何从脚本迭代表。任何建议/想法都值得赞赏。

我相信您在使用C或Python或任何您觉得方便的应用程序路线方面都走在了正确的轨道上。这里有一个可以编写脚本的不同方法

将Excel中的数据导出为CSV

$ cat test.csv 
Jacob Jacobs,M 
Rogers Bogers,M
Marsha Darsha,F
Tina Fina,F    
Mono Bono,M   
将其导入sqlite

sqlite> .mode csv
sqlite> .import test.csv proxy
sqlite> select * from proxy2;
"Jacob Jacobs",M             
"Rogers Bogers",M            
"Marsha Darsha",F            
"Tina Fina",F                
"Mono Bono",M                
记住男女人数

假设您的表名为
main
,其中有实名,您希望将其随机更改为
proxy
表中的名称

sqlite> .schema
CREATE TABLE proxy (fullname text, gender text);
CREATE TABLE main(fullname TEXT,gender TEXT,age INT);

sqlite> select * from main;
fullname,gender,age
"John Smith",M,20
"Marshall Dubin",M,20
"Kate Ortiz",F,20
"Ron Bunsh",M,20
"Kelly Torro",F,20

sqlite> select count(*) from main where gender='M';
count(*)                                           
3                                                  
sqlite> select count(*) from main where gender='F';
count(*)                                           
2                                                  
让您的应用程序记住以下信息:有3名男性和2名女性

使用不同的偏移量重复执行update语句

sqlite> update main
   ...> set fullname = (
   ...>   select fullname from proxy where gender='M' order by random() limit 1)
   ...> where rowid = (
   ...>   select rowid from main where gender='M' order by rowid limit 0,1);
限制0,1
更改为
限制1,1
,然后重新执行。继续,直到达到
限制2,1
。由于您有3条男性记录,请从限制0,1转到限制2,1

重复同样的步骤来匿名女性记录。将
gender='M'
更改为
gender='F'
。由于只有2个女性,您将执行两次
update
。一次使用
限制0,1
,然后使用
限制1,1

如果您在一个事务中运行这个,我希望您的脚本能够快速地完成更新

最终结果

sqlite> update main
   ...> set fullname = (
   ...>   select fullname from proxy where gender='M' order by random() limit 1)
   ...> where rowid = (
   ...>   select rowid from main where gender='M' order by rowid limit 0,1);

使用Bash编写SQLite脚本的示例- 其他选项

  • 在您的应用程序中,将假名字保存在两个数组中—一个用于男性,一个用于女性。这个想法是能够按性别随机抽取一个假名字
  • 执行
    按rowid从主订单中选择rowid,性别
  • 遍历记录
  • 若性别为男性,则从男性数组中随机抽取一条假记录;女性记录也是如此
  • 运行
    updatemainsetfullname=where rowid=
fullname       gender      age       
-------------  ----------  ----------
Rogers Bogers  M           20        
Jacob Jacobs   M           20        
Tina Fina      F           20        
Jacob Jacobs   M           20        
Jasmine        F           20