2015-08-08 79 views
2

问题:我有一个名字,姓氏和性别列表。我需要部分匿名数据库,用任意组成的名称替换此表中的所有名称。我还有一个电子表格,其中包含许多性别特定的任意名称。Anonymise SQLite数据库?

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

我可以在C中做到这一点相当平凡,但它是一个工作日 - 将电子表格导出为CSV,然后遍历表中的行,使用CSV文件中的下一个更新每个名称。不过,我不禁感到,通过将CSV名称数据转换为脚本来实现这一点非常简单,但我不知道如何从脚本中迭代表格。任何指针/想法表示赞赏。

回答

1

我相信你在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); 

更改limit 0,1limit 1,1并重新执行。继续下去,直到你到达limit 2,1。由于您有3条男性记录,因此从限制0,1到限制2,1。

重复同样的事情来隐藏女性记录。将gender='M'更改为gender='F'。由于只有2位女性,您将执行两次update。一旦与limit 0,1然后与limit 1,1

如果您在事务中运行此操作,我希望您的脚本能够快速通过更新。

结束结果

WAS

fullname gender  age  
---------- ---------- ---------- 
John Smith M   20   
Marshall D M   20   
Kate Ortiz F   20   
Ron Bunsh M   20   
Kelly Torr F   20   

IS脚本的SQLite与击的

fullname  gender  age  
------------- ---------- ---------- 
Rogers Bogers M   20   
Jacob Jacobs M   20   
Tina Fina  F   20   
Jacob Jacobs M   20   
Jasmine  F   20   

实施例 - http://andreaolivato.tumblr.com/post/133473114/using-sqlite3-in-bash 其他选项

  • 在您的应用程序中,将假名称保存在两个数组中 - 一个用于男性,一个用于女性。我们的想法是能够按性别需求拉动随机假名字
  • 通过记录做一个select rowid, gender from main order by rowid
  • 迭代
  • 如果性别是男的,拉从男性阵列随机假记录;女记录
  • 运行update main set fullname=<fake-record> where rowid=<selected-row-id>