• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

使用Perl生成模拟数据

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

最近,在工作中,为了测试代码,我们的团队创建了一些测试,这些测试可以模拟数据,或者在某些情况下可以模拟正收益,这使我们可以更轻松地隔离正在处理的特定代码块。 我确信这在大多数测试驱动设计(TDD)场景中是相当普遍的做法。 但是,这让我想到了当我开始学习JavaScript时会使用的API,它将生成随机用户。 https://randomuser.me/

这是用于模拟用户数据的重要资源。 您可能会将其视为随机生成的用户的Lorem Ipsum。 当我在考虑这个整洁的工具以及我们的团队如何模拟其他类型的数据时,我开始考虑如何制作自己的用户数据生成器,类似于上面的API。

如果您想查看该项目的源代码,这是我到目前为止的内容:

https://github.com/ethanjarrell/randomUsers

以下示例将显示我如何考虑此过程,以及一些有关如何执行此过程的代码段。 首先,我需要了解我想为每个用户生成的事物的类型。 这是我想出的清单:

  • 名称
  • 年龄
  • 性别
  • 种族
  • 生日
  • 电子邮件
  • 电话号码
  • 地址
  • 占用
  • 兴趣爱好
  • 眼睛的颜色
  • 发色
  • 肤色
  • 高度
  • 重量
  • 体型
  • 婚姻状况
  • 配偶(如果已婚)
  • 小孩儿
  • 最高学历
  • 学校
  • 学位
  • 学生贷款债务
  • 年薪
  • 宗教

事后看来,我可能对这个清单有些不满。 但这是一个有趣的编程挑战。 我的想法是,您可以通过以下两种方式之一来执行此操作。 首先,您可以创建数千个配置文件,并且在运行代码时,只需随机返回数千个配置文件。

第二种选择(我认为这将花费更少的时间)将是随机生成每个新人……以某种程度的随机性生成每个特征,而不依赖于任何包含完整随机配置文件的数据库。 例如,每次运行代码时,它将从列表或通过其他方式生成每个特征,并将其组合在一起以每次创建新的用户配置文件。

通过这样做,我意识到某些特质在某种程度上取决于其他特质。 而其他人则可以完全独立于其他任何人。 例如,您不能随机选择名称和性别。 否则,您最终可能会遇到一个叫Isabella的男人或一个叫Bucky的女人。 并不是说这有什么问题,但是为了保持一致性,我想在某种程度上保持社会规范。

其他细微的依赖特征可能是爱好,体重/体型等。 例如,如果我们随机选择这些特征,我们最终可能会成为一个爱好包括铁人三项但身体类型超重的人。 同样,这里没有错,但是重点是生成一致的数据。

另一个例子可能是教育/工作类型和年薪。 再次,随机选择,我们可以培养一个拥有电气工程硕士学位的人,年薪为12,000美元。

为了以一种有意义的方式解决这个问题,我首先生成了不需要相互依赖的所有数据。 然后,根据我最初的几个特征生成的内容,我可以从更孤立的数据子集中生成其余特征。

为了开始我的Perl文件,我将使用一些本地Perl软件包:

#!/usr/bin/perl
use DBI;
use strict;
use warnings;
use lib qw(..);
use JSON qw( );
use Data::Dumper;

在此示例中,我实际上并未使用DBI,但是如果您要将每个新生成的用户写入数据库,则DBI可能会派上用场。 我将使用lib和JSON。

首先,我上网查看了为特定条目随机生成的特征的列表。 这些都包含在上面的github链接中。 清理数据,删除空格并添加逗号后,我遍历列表,将每个条目推入数组。 然后,当我想从数组中进行随机选择时,可以使用Perl的“ rand”方法来获得随机条目。

我使用了很多列表来提取数据,但是我基本上使用相同的格式从列表中提取数据。 这是我如何创建男性和女性姓名列表的示例:

# declare a variable for the test txt file
my $maleNames = 'maleNames.txt';
# connect to and open the json file
open (FH, "< $maleNames") or die "Can't open $maleNames for read: $!";
my @maleLines ;
while (<FH>) {
push ( @maleLines , $_);
}
close FH or die "Cannot close $maleNames: $!";
my @maleList = ();
foreach my $x ( @maleLines ) {
my $str = $x;
@maleList = split(',', $str);
}
# declare a variable for the test txt file
my $femaleNames = 'femaleNames.txt';
# connect to and open the json file
open (FH, "< $femaleNames") or die "Can't open $femaleNames for read: $!";
my @femaleLines ;
while (<FH>) {
push ( @femaleLines , $_);
}
close FH or die "Cannot close $femaleNames: $!";
my @femaleList = ();
foreach my $x ( @femaleLines ) {
my $str = $x;
@femaleList = split(',', $str);
}

现在,我可以模拟抛硬币,如下所示:

my $gender = int(rand(2));

这将为性别生成一个0或1的数字。

然后我可以使用一个条件:

if ( $gender == 0 ) {
$gender = "female";
} else {
$gender = "male";
}

性别随机决定后,我们可以根据随机选择的性别结果从男性或女性名字列表中随机抽取新记录。

生成随机电话号码:

现在,一旦在Random中选择了状态,我就可以进行API调用来确定状态的区号,但是我现在还没有具体说明。 我真正关心的是该号码采用电话号码格式((xxx)xxx-xxxx)。

为此,我只是随机生成了10位数字,并将它们连接为正确的格式:

my $n1 = int(rand(8)+1);
my $n2 = int(rand(9));
my $n3 = int(rand(9));
my $n4 = int(rand(9));
my $n5 = int(rand(9));
my $n6 = int(rand(9));
my $n7 = int(rand(9));
my $n8 = int(rand(9));
my $n9 = int(rand(9));
my $n10 = int(rand(9));
my $phoneNumber = "($n1$n2$n3) $n4$n5$n6-$n7$n8$n9$n10";

生成随机邮政编码:

邮编也一样:

my $z1 = int(rand(8)+1);
my $z2 = int(rand(9));
my $z3 = int(rand(9));
my $z4 = int(rand(9));
my $z5 = int(rand(9));
my $zipcode = $z1 . $z2 . $z3 . $z4 . $z5;

生成随机电子邮件:

我认为电子邮件可能会有所不同。 例如,如果我已经生成了一个随机名称,则可以简单地执行以下操作:

firstName.lastName @ emailServer . com

虽然,这似乎并不令人信服,所以我想让电子邮件有几种。

my @emails = ("gmail", "hotmail", "protonmail", "yahoo", "aol");
my $index = rand @emails ;
my $email = $emails[$index];
my $index2 = rand @adjectiveList ;
my $adjective = $adjectiveList[$index2];
my $index3 = rand @animalsList ;
my $myAnimal = $animalsList[$index3];

每次运行代码时,都会从5个列表中随机选择一个电子邮件服务。然后从数百个列表中随机选择一个形容词和动物。 这将允许我创建以下格式的电子邮件:

fuzzy . kitten . 01 @ gmail .com

要么

firstName . the . terrible @ yahoo .com

使用这些变量,我创建了5种格式类型,并从1到5之间随机选择一个数字。根据结果,新电子邮件将获得该格式。 看起来是这样的:

my $emailAddress = "";
my $girlGuy ="";
if ($gender eq "male"){
$girlGuy = "guy";
}else {
$girlGuy = "girl";
}
my $emailFormat = int(rand(5));
if ($emailFormat == 0){
$emailAddress = $lastName[0] . "." . $lastName[1] . $sN3 . $z2 . "@" . $email . ".com";
} elsif ($emailFormat == 1) {
$emailAddress = $adjective . "_" . $myAnimal . $sN1 . "@" . $email . ".com";
} elsif ($emailFormat == 2) {
$emailAddress = $adjective . "_" . $lastName[0] . $sN1 . "@" . $email . ".com";
} elsif ($emailFormat == 3) {
$emailAddress = $newState . "_" . $girlGuy . $sN1 . $sN2 . $sN3 . "@" . $email . ".com";
} elsif ($emailFormat == 4) {
$emailAddress = $adjective . "_" . $newCity . "_" . $girlGuy . $sN1 . $sN2 . $sN3 . "@" . $email . ".com";
}
$emailAddress =~ s/\s+//g;

产生随机工作和学位:

对我来说,另一个有趣的事情是创造一份工作和一个学位。 我使用了一个随机职位的列表,并随机选择一个,类似于我创建并随机选择一个男性或女性名字的方式。 然后,对于新的随机作业,我使用Perl中的substr方法比较了该作业。 我基本上要做的是将职位的子字符串与大量潜在的学位课程进行比较。 例如,如果工作是:

Electrical Engineer

然后,我可能只拿到职位的前5个字母:

elect

并遍历该列表中的所有学位课程,看是否存在匹配条件。 如果有匹配项,我会将匹配项添加到该新随机用户拥有的度数列表中。 我有学士,副学士和硕士学位课程的清单,因此我将全部检查,并将匹配项推入一个度数组:

my $substring = substr $job, 0, 5;
my @degrees = ();
foreach my $x ( @bachelorList ) {
if (index($x, $substring) != -1) {
push @degrees , $x;
}
}
foreach my $x ( @associateList ) {
if (index($x, $substring) != -1) {
push @degrees , $x;
}
}
foreach my $x ( @masterList ) {
if (index($x, $substring) != -1) {
push @degrees , $x;
}
}
my $degree = "";
foreach my $x ( @degrees ) {
$degree = $degree . ", " . $x;
}

最后,我只是将所有结果连接到一个字符串中。

最终,我没有做完所有决定,最后得到的结果是哈希值,然后使用Dumper打印出来。 我的哈希看起来像这样,变量作为哈希值:

my $json = {NAME=>$name, WEIGHT=>$finalWeight, HEIGHT=>$finalHeight, EYE_COLOR=>$eyeColor, BODY_TYPE=>$bodyType, HAIR_COLOR=>$hairColor, SKIN_COLOR=>$skinColor, RELIGION=>$myReligion, SCHOOL=>$school, HIGHEST_LEVEL_OF_EDUCATION=>$highestLevelOfEducation, AGE=>$age, STUDENT_LOAN_DEBT=>'$' . $studentLoanDebt . '.00', ANNUAL_SALARY=>'$' . $annualSalary . '.00', CHILDREN=>$kids, BIRTHDAY=>$birthDate, GENDER=>$gender, MARITAL_STATUS=>$married, SPOUSE=>$spouse, ADDRESS=>$streetNumber . " " . $newStreet . ", " . $newCity . ", " . $newState . " " . $zipcode, PHONE=>$phoneNumber, EMAIL=>$emailAddress, OCCUPATION=>$job, HOBBIES=>$hobby1 . ", " . $hobby2 . ", " . $hobby3, DEGREE=>$degree, ETHNICITY=>$ethnicBackground};
print Dumper $json;

而且我的输出通常类似于以下内容:

{
'ADDRESS' => '7841 3rd Street West, Duarte, Minnesota 87604',
'GENDER' => 'female',
'SPOUSE' => 'Raleigh Teer',
'STUDENT_LOAN_DEBT' => '$6336.00',
'HAIR_COLOR' => 'Dark Brown',
'HEIGHT' => '6 feet, 10 inches',
'EMAIL' => ' [email protected] ',
'SKIN_COLOR' => 'Light Brown',
'RELIGION' => 'Stoicism',
'HOBBIES' => 'Golf, Tutoring Children, Photography',
'BIRTHDAY' => 'March 7, 1983',
'PHONE' => '(361) 734-5735',
'WEIGHT' => '327 lbs',
'AGE' => 35,
'MARITAL_STATUS' => 'married',
'DEGREE' => ', Bachelor of Accountancy, Master of Accountancy, Master of Accounting and Information Systems',
'ETHNICITY' => 'Chinese Australian',
'SCHOOL' => 'University of Minnesota-Duluth',
'NAME' => 'Maggie Davila',
'HIGHEST_LEVEL_OF_EDUCATION' => 'Masters Degree',
'BODY_TYPE' => 'Thick',
'EYE_COLOR' => 'Black',
'OCCUPATION' => 'Accountant',
'CHILDREN' => 5,
'ANNUAL_SALARY' => '$68077.00'
};

这是一个非常有趣的项目,即使它不是非常有用,我仍然在学习Perl方面学到了很多东西。 希望你喜欢。

From: https://hackernoon.com/generating-mock-data-with-perl-7836a2ca0548


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Perl输出带颜色行号或普通输出行发布时间:2022-07-22
下一篇:
Perl内置特殊变量发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap