我有一个带有名称Title的列的sqlite3表,它存储了一些电影的名称。
Table name - table1
Column name - Title
Examples data: "Casablanca" (1983) {The Cashier and the Belly Dancer (#1.4)}
我有另一个sqlite3表,其中包含一个存储电影标题的列。
Table name - table2
Column name - Title
Examples data: casa blanca
这两个表都是使用不同的数据集创建的,因此虽然电影名称相同(casa blanca
vs "Casablanca" (1983) {The Cashier and the Belly Dancer (#1.4)}
),但两者都存储有额外的文本。
我想要做的是对两列中已存储的数据进行SANITIZE。通过消毒,我想剥离细胞内容: 空间 2.将字符拼写为!,',“,逗号等。 3.将全部转换为小写
我希望至少可以在两个列之间进行一定程度的匹配。
我的问题是,我如何对已存储在sqlite表中的数据执行这些清理。我没有选择在加载之前进行清理,因为我只能访问已加载的数据库。
我正在使用sqlite 3.7.13,而我正在使用sqlite manager作为gui。
谢谢。
答案 0 :(得分:2)
此任务过于专业化,无法仅在SQL中完成。
您应该编写简单的Perl或Python脚本,它将扫描您的表,逐行读取数据,擦除它以满足您的要求并将其写回。
这是Perl的例子:
use DBI;
my $dbh = DBI->connect("dbi:mysql:database=my.db");
# replace rowid with your primary key, but it should work as is:
my $sth = $dbh->prepare(qq{
SELECT rowid,*
FROM table1
});
while (my $row = $sth->fetchrow_hashref()) {
my $rowid = $row->{rowid};
my $title = $row->{title};
# sanitize title:
$title = lc($title); # convert to lowercase
$title =~ s/,//g; # remove commas
# do more sanitization as you wish
# ...
# write it back to database:
$dbh->do(
qq{
UPDATE table1
SET title = ?
WHERE rowid = ?
}, undef,
$title,
$rowid,
);
}
$sth->finish();
$dbh->disconnect();