问题:我有一个包含名字,姓氏和性别列的表格。我需要通过用任意组成的名称替换此表中的所有名称来部分匿名数据库。我还有一个电子表格,其中包含许多针对性别的任意名称。
鉴于此,如何遍历此表的行,并依次用电子表格中的名称替换每个名称?
我可以相当简单地在C中执行此操作,但这只是工作日 - 将电子表格导出为CSV,然后遍历表格的行,使用CSV文件中的下一个更新每个名称。但是,通过将CSV名称数据转换为脚本,我无法感觉有更简单的方法,但我不知道如何从脚本中遍历表格。任何指针/想法都赞赏。
答案 0 :(得分: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名女性的信息。
使用不同的偏移重复执行更新语句
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,1
更改为limit 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
fullname gender age
------------- ---------- ----------
Rogers Bogers M 20
Jacob Jacobs M 20
Tina Fina F 20
Jacob Jacobs M 20
Jasmine F 20
使用Bash编写SQLite脚本的示例 - 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>