匿名化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