我设置了一个 mySQL 数据库和一个“联系人”表,其中包含用于不同联系人信息的多个字段。这让我感到莫名其妙,但我猜出于某种原因,客户在添加到数据库时并不总是将他们的电子邮件信息放在“电子邮件”字段中。是否有一种快速简便的方法可以在每条记录的每个字段中搜索“@”符号?如果没有,有人可以帮我编写一个 perl 行或脚本,以便在 txt 文件中只留下带有“@”的字符串吗?我计划研究 perl 以进行数据按摩等,但我现在没有时间。谢谢!
-奥斯汀
对于每一列,你可以做
SELECT * FROM table WHERE col1 LIKE '%@%' OR col2 LIKE '%@%' OR ....
只要确保您省略了电子邮件列,您就会得到可能在错误列中包含电子邮件的行。
由于您现在包含了这是一个包含许多列的表的信息,并且这是对所描述方法的障碍,您可以使用 mysql 的数据字典为您的表生成列名列表。
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='your_database' AND TABLE_NAME='your_table' AND COLUMN_NAME != 'email';
使用列名应该很容易使用支持宏的编辑器,并使用它在几分钟内为您的 OR 子句构建完整的列列表。
当某些列包含时,这将遍历所有行并将结果保存在文件中@
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
use DBI;
my $dbh = DBI->connect('dbi:mysql:db_name','user','pass')
or die "Connection Error: $DBI::errstr\n";
my $sql = "select * from table";
my $sth = $dbh->prepare($sql);
$sth->execute or die "SQL Error: $DBI::errstr\n";
open my $fh, ">", "output.txt" or die $!;
while (my $r = $sth->fetchrow_hashref) {
$r->{$_} =~ /@/ and print $fh "Found '@' in column $_ of row:", Dumper $r
for keys %$r;
}