如何清理sqlite3列中的数据

时间:2012-11-18 11:44:43

标签: sqlite sanitize

我有一个带有名称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。

谢谢。

1 个答案:

答案 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();