2015-08-08 100 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>