$ cat pm_11139481_csv_kv_pairs_data.txt
http://example.com/?AB1=101&NN=201&XYZ=401
http://example.net/?AB1=102&XYZ=402&MM=302
http://example.org/?MM=303&XYZ=403&NN=203&AB1=103
http://example.mil/?
https://example.mil/
http://example.edu/?PQR=504
####
#!/usr/bin/env perl
use strict;
use warnings;
use autodie;
use Text::CSV;
my $source_data = 'pm_11139481_csv_kv_pairs_data.txt';
my $created_csv = 'pm_11139481_csv_kv_pairs_data.csv';
my %data;
my $last_index = -1;
extract_data($source_data, \%data, \$last_index);
{
my @headers = sort keys %data;
my $csv = Text::CSV::->new();
open my $csv_fh, '>', $created_csv;
$csv->say($csv_fh, \@headers);
for my $i (0 .. $last_index) {
$csv->say($csv_fh, [map $data{$_}[$i], @headers]);
}
}
sub extract_data {
my ($in_file, $data, $last_index) = @_;
open my $fh, '<', $in_file;
while (<$fh>) {
++$$last_index;
chomp;
my $qs = (split /[?]/)[1];
next unless defined $qs;
for my $kv_pair (split /[&]/, $qs) {
my ($key, $val) = split /[=]/, $kv_pair;
$data->{$key}[$$last_index] = $val;
}
}
return;
}
####
$ cat pm_11139481_csv_kv_pairs_data.csv
AB1,MM,NN,PQR,XYZ
101,,201,,401
102,302,,,402
103,303,203,,403
,,,,
,,,,
,,,504,