Template:US Demographics/perlscript
Appearance
This template makes a table of US state demographics in the form specified by Template:US DemogTable. The template was constructed by the following script, which extracts numbers from US census data files from https://www.census.gov/popest/states/asrh/tables/
To generate a table for a specified state
- {{US Demographics|state=<state>}}
To generate a table for the state based on the pagename
- {{US Demographics}}
These tables use the "single or in combination" numbers, so some rows sum to more than 100%.
When new census estimates come out, please either use the script below to update the template, or ask User:Gimmetrow or User:ClairSamoht (mostly retired) for support.
Please click on EDIT to grab a copy of this script
[edit]# HOW TO USE THIS SCRIPT:
# You will need a copy of Perl on your PC. You can
# download a copy at http://www.activestate.com/
# and install it in about ten minutes.
# Download all the CSV files. They will be located at
# https://www.census.gov/popest/states/asrh/tables/
# with filenames like SC-EST2005-03-42.csv
# The EST2005-03 indicates which file series is being used.
# The 42 indicates the state being referenced.
# File formats are going to change. The "7" in year 2000
# get_data calls indicates that the desired data is in
# column 7. When the 2006 estimates come out, it'll probably
# shove everything over, so you would changes that to 8.
# You'll also need to change the value of SC-EST2005- to whatever
# the new filename is.
# Put all the CSV files in the same directory with this script,
# and execute this script. It will generate a file named
# template.txt, which is the data which needs to be inserted
# in Template:US Demographics
# It's a quick-and-dirty script, which is what Perl was
# intended for. You will want to check your data, to make
# sure you're grabbing the right numbers from the file.
# Otherwise, you're going to get some mighty strange tables.
# This script is NOT subject to the GNU Free Documentation
# License, as it expressly prohibits alteration, and this
# script will be useless if NOT altered.
# Script copyright by user ClairSamoht, August 2006.
# You may download it, modify it, and execute it ONLY for
# maintaining Wikipedia's Template:US Demographics
# You may NOT republish or redistribute this script, or
# use it for any purpose other than intended.
# But then, it's an awfully simple script. If you're
# smart enough to figure out how to modify it for other
# purposes, you can write the script you need from scratch
# in less time than to modify this script.
use Text::ParseWords;
sub pct
{
my ($inval, $base) = @_;
$inval = stripcommas ($inval);
$base = stripcommas ($base);
if ($base < 1)
{
return "0.0";
}
my $portion = 100 * $inval/$base;
return sprintf (" %6.2f", $portion);
}
sub stripcommas
{
my ($val) = @_;
$val =~ s/,//g;
return $val;
}
sub get_data
{
my ($useline, $item_number) = @_;
my @parts = parse_line(",", 0, $lines[$useline]);
return stripcommas($parts[$item_number]);
}
sub make_table
{
foreach my $val (values %DATA)
{
$_ = '';
}
$DATA{fname} = shift;
open (FILE, "< $DATA{'fname'}");
my @lines = <FILE>;
close (FILE);
$count = @lines;
print "$DATA{fname} has $count lines\n";
$DATA{state} = $lines[1];
my @parts = split (/ for /, $lines[1]);
$DATA{state} = $parts[1];
my @parts = split (/: /, $DATA{state});
$DATA{state} = $parts[0];
$DATA{tot2005} = get_data ( 4,1);
$DATA{white2005} = get_data (13,1);
$DATA{black2005} = get_data (14,1);
$DATA{AIAN2005} = get_data (15,1);
$DATA{asian2005} = get_data (16,1);
$DATA{NHPI2005} = get_data (17,1);
$DATA{nh_white2005} = get_data (27,1);
$DATA{nh_black2005} = get_data (28,1);
$DATA{nh_AIAN2005} = get_data (29,1);
$DATA{nh_asian2005} = get_data (30,1);
$DATA{nh_NHPI2005} = get_data (31,1);
$DATA{h_white2005} = get_data (41,1);
$DATA{h_black2005} = get_data (42,1);
$DATA{h_AIAN2005} = get_data (43,1);
$DATA{h_asian2005} = get_data (44,1);
$DATA{h_NHPI2005} = get_data (45,1);
$DATA{tot2000} = get_data ( 4,8);
$DATA{white2000} = get_data (13,8);
$DATA{black2000} = get_data (14,8);
$DATA{AIAN2000} = get_data (15,8);
$DATA{asian2000} = get_data (16,8);
$DATA{NHPI2000} = get_data (17,8);
$DATA{nh_white2000} = get_data (27,8);
$DATA{nh_black2000} = get_data (28,8);
$DATA{nh_AIAN2000} = get_data (29,8);
$DATA{nh_asian2000} = get_data (30,8);
$DATA{nh_NHPI2000} = get_data (31,8);
$DATA{h_white2000} = get_data (41,8);
$DATA{h_black2000} = get_data (42,8);
$DATA{h_AIAN2000} = get_data (43,8);
$DATA{h_asian2000} = get_data (44,8);
$DATA{h_NHPI2000} = get_data (45,8);
if (0)
{
print OFILE "tot2005 $DATA{tot2005} \n";
print OFILE "white2005 $DATA{white2005} \n";
print OFILE "black2005 $DATA{black2005} \n";
print OFILE "AIAN2005 $DATA{AIAN2005} \n";
print OFILE "asian2005 $DATA{asian2005} \n";
print OFILE "NHPI2005 $DATA{NHPI2005} \n";
print OFILE "hwhite2005 $DATA{h_white2005} \n";
print OFILE "hblack2005 $DATA{h_black2005} \n";
print OFILE "hAIAN2005 $DATA{h_AIAN2005} \n";
print OFILE "hasian2005 $DATA{h_asian2005} \n";
print OFILE "hNHPI2005 $DATA{h_NHPI2005} \n";
print OFILE "nhwhite2005 $DATA{nh_white2005} \n";
print OFILE "nhblack2005 $DATA{nh_black2005} \n";
print OFILE "nhAIAN2005 $DATA{nh_AIAN2005} \n";
print OFILE "nhasian2005 $DATA{nh_asian2005} \n";
print OFILE "nhNHPI2005 $DATA{nh_NHPI2005} \n";
print OFILE "tot2000 $DATA{tot2000} \n";
print OFILE "white2000 $DATA{white2000} \n";
print OFILE "black2000 $DATA{black2000} \n";
print OFILE "AIAN2000 $DATA{AIAN2000} \n";
print OFILE "asian2000 $DATA{asian2000} \n";
print OFILE "NHPI2000 $DATA{NHPI2000} \n";
print OFILE "hwhite2000 $DATA{h_white2000} \n";
print OFILE "hblack2000 $DATA{h_black2000} \n";
print OFILE "hAIAN2000 $DATA{h_AIAN2000} \n";
print OFILE "hasian2000 $DATA{h_asian2000} \n";
print OFILE "hNHPI2000 $DATA{h_NHPI2000} \n";
print OFILE "nhwhite2000 $DATA{nh_white2000} \n";
print OFILE "nhblack2000 $DATA{nh_black2000} \n";
print OFILE "nhAIAN2000 $DATA{nh_AIAN2000} \n";
print OFILE "nhasian2000 $DATA{nh_asian2000} \n";
print OFILE "nhNHPI2000 $DATA{nh_NHPI2000} \n";
}
my $template = <<EOHEADER;
| state = {{US DemogTable{{!}}state{{!}}fname{{!}}=
{{!}}p_white2000{{!}}p_black2000{{!}}p_AIAN2000{{!}}p_asian2000{{!}}p_NHPI2000{{!}}=
{{!}}h_white2000{{!}}h_black2000{{!}}h_AIAN2000{{!}}h_asian2000{{!}}h_NHPI2000{{!}}=
{{!}}p_white2005{{!}}p_black2005{{!}}p_AIAN2005{{!}}p_asian2005{{!}}p_NHPI2005{{!}}=
{{!}}h_white2005{{!}}h_black2005{{!}}h_AIAN2005{{!}}h_asian2005{{!}}h_NHPI2005{{!}}=
{{!}}d_white{{!}}d_black{{!}}d_AIAN{{!}}d_asian{{!}}d_NHPI{{!}}=
{{!}}x_white{{!}}x_black{{!}}x_AIAN{{!}}x_asian{{!}}x_NHPI{{!}}=
{{!}}h_white{{!}}h_black{{!}}h_AIAN{{!}}h_asian{{!}}h_NHPI}}
EOHEADER
my $state = $DATA{state};
my $fname = $DATA{fname};
my $p_white2000 = pct ($DATA{white2000}, $DATA{tot2000});
my $p_black2000 = pct ($DATA{black2000}, $DATA{tot2000});
my $p_AIAN2000 = pct ($DATA{AIAN2000}, $DATA{tot2000});
my $p_asian2000 = pct ($DATA{asian2000}, $DATA{tot2000});
my $p_NHPI2000 = pct ($DATA{NHPI2000}, $DATA{tot2000});
my $h_white2000 = pct ($DATA{h_white2000}, $DATA{tot2000});
my $h_black2000 = pct ($DATA{h_black2000}, $DATA{tot2000});
my $h_AIAN2000 = pct ($DATA{h_AIAN2000}, $DATA{tot2000});
my $h_asian2000 = pct ($DATA{h_asian2000}, $DATA{tot2000});
my $h_NHPI2000 = pct ($DATA{h_NHPI2000}, $DATA{tot2000});
my $p_white2005 = pct ($DATA{white2005}, $DATA{tot2005});
my $p_black2005 = pct ($DATA{black2005}, $DATA{tot2005});
my $p_AIAN2005 = pct ($DATA{AIAN2005}, $DATA{tot2005});
my $p_asian2005 = pct ($DATA{asian2005}, $DATA{tot2005});
my $p_NHPI2005 = pct ($DATA{NHPI2005}, $DATA{tot2005});
my $h_white2005 = pct ($DATA{h_white2005}, $DATA{tot2005});
my $h_black2005 = pct ($DATA{h_black2005}, $DATA{tot2005});
my $h_AIAN2005 = pct ($DATA{h_AIAN2005}, $DATA{tot2005});
my $h_asian2005 = pct ($DATA{h_asian2005}, $DATA{tot2005});
my $h_NHPI2005 = pct ($DATA{h_NHPI2005}, $DATA{tot2005});
my $d_white = pct ($DATA{white2005} - $DATA{white2000},$DATA{white2000});
my $d_black = pct ($DATA{black2005} - $DATA{black2000},$DATA{black2000});
my $d_AIAN = pct ($DATA{AIAN2005} - $DATA{AIAN2000}, $DATA{AIAN2000} );
my $d_asian = pct ($DATA{asian2005} - $DATA{asian2000},$DATA{asian2000});
my $d_NHPI = pct ($DATA{NHPI2005} - $DATA{NHPI2000}, $DATA{NHPI2000} );
my $x_white = pct ($DATA{nh_white2005} - $DATA{nh_white2000},$DATA{nh_white2000});
my $x_black = pct ($DATA{nh_black2005} - $DATA{nh_black2000},$DATA{nh_black2000});
my $x_AIAN = pct ($DATA{nh_AIAN2005} - $DATA{nh_AIAN2000}, $DATA{nh_AIAN2000} );
my $x_asian = pct ($DATA{nh_asian2005} - $DATA{nh_asian2000},$DATA{nh_asian2000});
my $x_NHPI = pct ($DATA{nh_NHPI2005} - $DATA{nh_NHPI2000}, $DATA{nh_NHPI2000} );
my $h_white = pct ($DATA{h_white2005} - $DATA{h_white2000},$DATA{h_white2000});
my $h_black = pct ($DATA{h_black2005} - $DATA{h_black2000},$DATA{h_black2000});
my $h_AIAN = pct ($DATA{h_AIAN2005} - $DATA{h_AIAN2000}, $DATA{h_AIAN2000} );
my $h_asian = pct ($DATA{h_asian2005} - $DATA{h_asian2000},$DATA{h_asian2000});
my $h_NHPI = pct ($DATA{h_NHPI2005} - $DATA{h_NHPI2000}, $DATA{h_NHPI2000} );
$fname =~ s/SC-EST2005-//i;
$template =~ s/state/$state/gi;
$template =~ s/fname/$fname/gi;
$template =~ s/p_white2000/$p_white2000/gi;
$template =~ s/p_black2000/$p_black2000/gi;
$template =~ s/p_AIAN2000/$p_AIAN2000/gi;
$template =~ s/p_asian2000/$p_asian2000/gi;
$template =~ s/p_NHPI2000/$p_NHPI2000/gi;
$template =~ s/h_white2000/$h_white2000/gi;
$template =~ s/h_black2000/$h_black2000/gi;
$template =~ s/h_AIAN2000/$h_AIAN2000/gi;
$template =~ s/h_asian2000/$h_asian2000/gi;
$template =~ s/h_NHPI2000/$h_NHPI2000/gi;
$template =~ s/p_white2005/$p_white2005/gi;
$template =~ s/p_black2005/$p_black2005/gi;
$template =~ s/p_AIAN2005/$p_AIAN2005/gi;
$template =~ s/p_asian2005/$p_asian2005/gi;
$template =~ s/p_NHPI2005/$p_NHPI2005/gi;
$template =~ s/h_white2005/$h_white2005/gi;
$template =~ s/h_black2005/$h_black2005/gi;
$template =~ s/h_AIAN2005/$h_AIAN2005/gi;
$template =~ s/h_asian2005/$h_asian2005/gi;
$template =~ s/h_NHPI2005/$h_NHPI2005/gi;
$template =~ s/d_white/$d_white/gi;
$template =~ s/d_black/$d_black/gi;
$template =~ s/d_AIAN/$d_AIAN/gi;
$template =~ s/d_asian/$d_asian/gi;
$template =~ s/d_NHPI/$d_NHPI/gi;
$template =~ s/x_white/$x_white/gi;
$template =~ s/x_black/$x_black/gi;
$template =~ s/x_AIAN/$x_AIAN/gi;
$template =~ s/x_asian/$x_asian/gi;
$template =~ s/x_NHPI/$x_NHPI/gi;
$template =~ s/h_white/$h_white/gi;
$template =~ s/h_black/$h_black/gi;
$template =~ s/h_AIAN/$h_AIAN/gi;
$template =~ s/h_asian/$h_asian/gi;
$template =~ s/h_NHPI/$h_NHPI/gi;
print OFILE $template;
}
opendir(DIR, ".") or die "can't opendir $dirname: $!";
my @files = readdir (DIR);
closedir (DIR);
my $outfile = "template2.txt";
open (OFILE, '>', $outfile);
print OFILE <<TOPOFILE;
<noinclude>{{esoteric}}For documentation see [[/perlscript]]
</noinclude><includeonly>{{#switch: {{{state|{{PAGENAME}}}}}
TOPOFILE
my $quit = 0;
foreach my $val (@files)
{
if ($val =~ /csv/i && $quit < 1)
{
make_table ($val);
}
}
print OFILE <<EOFILE;
}}</includeonly>
<noinclude>
[[Category:Demographics of the United States|*]]
</noinclude>
EOFILE
close (OFILE);