Несколько лет спустя просто добавить еще одно простое базовое R-решение, которое по какой-то причине отсутствует здесь xtabs
xtabs(Frequency ~ Category, df)
# Category
# First Second Third
# 30 5 34
Или, если хотите data.frame
назад
as.data.frame(xtabs(Frequency ~ Category, df))
# Category Freq
# 1 First 30
# 2 Second 5
# 3 Third 34
Поскольку вы не указали, как должен выглядеть результат на самом деле, я взял удар в темноте и сделал предположение, посмотрев на входные данные и ваши регулярные выражения.
Для получения кода качества продукции, пожалуйста, следуйте совету @Grinnz, чтобы использовать вместо него Text :: CSV .
#!/usr/bin/perl
use strict;
use warnings;
print "Entry,Site,Author,Release,Date,Version,Changes,Comment\n";
my @entries;
while(<DATA> ) {
chomp;
if (my($site) = /^Route:\s+(.+)$/) {
# start of new entry
push(@entries, {
site => $site,
});
} elsif (my($author) = /^Author:\s+(.+)$/) {
$entries[-1]->{author} = $author;
}
}
foreach my $index (0..$#entries) {
my $entry = $entries[$index];
print "$index,$entry->{site},$entry->{author},,,,,\n";
}
__DATA__
Route: TUCSON-AZ
Author: upham
Date: 2018-06-07 20:09:17 UTC
Release:0.0
Content:
Full Release
Comment:
Initial setup
*** Modified on Mon Jun 11 19:18:40 PDT 2018 by upham ***
QRC Acceptor: Admin
Log: http://universityofarizona/ECE101/rev0.0_060718_130854-4307-1528769914.qclog
Successful
Status: {Objects succeeded (1)} {}
--------------------------------------------------
Route: YUMA-AZ
Author: upham
Date: 2018-06-07 20:09:18 UTC
Release:0.0
Content:
Full Release
Comment:
Initial setup
*** Modified on Tue Sep 25 15:40:02 PDT 2018 by upham ***
QRC Acceptor: Admin
Log: http://universityofarizona/ECE101/rev0.0_060718_130854-4307-1537915198.qclog
Successful
Status: {Objects succeeded (33)} {}
--------------------------------------------------
Пример выполнения:
$ perl dummy.pl
Entry,Site,Author,Release,Date,Version,Changes,Comment
0,TUCSON-AZ,upham,,,,,
1,YUMA-AZ,upham,,,,,
РЕДАКТИРОВАТЬ: альтернативным подходом будет использование
if (/^Route:/../^----------/) {
# we are inside a log entry...
}
и затем обнаружение
my($keyword, $data) = /^(\w+):\s*(.*)$/;
my($line) = /^\s+(.+)$/;
внутри этого блока.
Шаг 1: Добавить use strict
и use warnings
. Это выдает ошибки о необъявленных переменных.
Шаг 2: Добавить my
, чтобы объявить $rlseHistRepo
. Также добавьте my (%rlsSite, %rlsAuthor)
, чтобы объявить два хэша, используемых в вашем последнем цикле. Но это странно, так как вы читаете значения из этих хешей без всякого хранения в них данных. Это дает нам несколько ошибок «неинициализированного значения». Поэтому я думаю, что нам нужно переосмыслить вещи.
Идея состоит в том, чтобы создать один хэш для каждой записи. И когда запись заканчивается (когда мы получаем строку из тире), мы выводим эту запись. Примерно так:
my @keys = qw[Route Author Date Release Log
Status Content Comment];
my %record;
while(<IN> ) {
chomp;
if (/-----/) {
say OUTCSV join ',', @record{@keys};
%record = ();
}
# ignore lines without a ':'
next unless /:/;
# ignore the '***' lines
next if /\*\*\*/;
my ($key, $value) = split /\s*:\s*/, Шаг 1: Добавить use strict
и use warnings
. Это выдает ошибки о необъявленных переменных.
Шаг 2: Добавить my
, чтобы объявить $rlseHistRepo
. Также добавьте my (%rlsSite, %rlsAuthor)
, чтобы объявить два хэша, используемых в вашем последнем цикле. Но это странно, так как вы читаете значения из этих хешей без всякого хранения в них данных. Это дает нам несколько ошибок «неинициализированного значения». Поэтому я думаю, что нам нужно переосмыслить вещи.
Идея состоит в том, чтобы создать один хэш для каждой записи. И когда запись заканчивается (когда мы получаем строку из тире), мы выводим эту запись. Примерно так:
[110] Шаг 3: Очистить вещи, удалив несколько ненужных переменных и превратив их в фильтр Unix (чтение из STDIN
и запись в STDOUT
) - это на самом деле легче писать и делает вашу программу гораздо более гибкой.
#!/usr/bin/perl
use strict;
use warnings;
use feature 'say';
my @keys = qw[Route Author Date Release Log
Status Content Comment];
say "Site,Author,Release,Date,Version,Changes,Comment";
say ",,,,,,,";
my %record;
while (<>) {
chomp;
if (/-----/) {
say join ',', @record{@keys};
%record = ();
}
# ignore lines without a ':'
next unless /:/;
# ignore the '***' lines
next if /\*\*\*/;
if (my ($key, $value) = split /\s*:\s*/, Шаг 1: Добавить use strict
и use warnings
. Это выдает ошибки о необъявленных переменных.
Шаг 2: Добавить my
, чтобы объявить $rlseHistRepo
. Также добавьте my (%rlsSite, %rlsAuthor)
, чтобы объявить два хэша, используемых в вашем последнем цикле. Но это странно, так как вы читаете значения из этих хешей без всякого хранения в них данных. Это дает нам несколько ошибок «неинициализированного значения». Поэтому я думаю, что нам нужно переосмыслить вещи.
Идея состоит в том, чтобы создать один хэш для каждой записи. И когда запись заканчивается (когда мы получаем строку из тире), мы выводим эту запись. Примерно так:
[110] Шаг 3: Очистить вещи, удалив несколько ненужных переменных и превратив их в фильтр Unix (чтение из STDIN
и запись в STDOUT
) - это на самом деле легче писать и делает вашу программу гораздо более гибкой.
[111] Как уже упоминали другие, в производственном коде вы хотели бы использовать Text :: CSV для создания выходных данных.
, 2) {
# Some keys have their values on the next line
if ($value !~ /\S/) {
chomp($value = <>);
$value =~ s/^\s+//;
}
$record{$key} = $value;
}
}
Как уже упоминали другие, в производственном коде вы хотели бы использовать Text :: CSV для создания выходных данных.
, 2);
# Some keys have their values on the next line
if ($value !~ /\S/) {
chomp($value = <IN>);
$value =~ s/^\s+//;
}
$record{$key} = $value;
}
Шаг 3: Очистить вещи, удалив несколько ненужных переменных и превратив их в фильтр Unix (чтение из STDIN
и запись в STDOUT
) - это на самом деле легче писать и делает вашу программу гораздо более гибкой.
#!/usr/bin/perl
use strict;
use warnings;
use feature 'say';
my @keys = qw[Route Author Date Release Log
Status Content Comment];
say "Site,Author,Release,Date,Version,Changes,Comment";
say ",,,,,,,";
my %record;
while (<>) {
chomp;
if (/-----/) {
say join ',', @record{@keys};
%record = ();
}
# ignore lines without a ':'
next unless /:/;
# ignore the '***' lines
next if /\*\*\*/;
if (my ($key, $value) = split /\s*:\s*/, Шаг 1: Добавить use strict
и use warnings
. Это выдает ошибки о необъявленных переменных.
Шаг 2: Добавить my
, чтобы объявить $rlseHistRepo
. Также добавьте my (%rlsSite, %rlsAuthor)
, чтобы объявить два хэша, используемых в вашем последнем цикле. Но это странно, так как вы читаете значения из этих хешей без всякого хранения в них данных. Это дает нам несколько ошибок «неинициализированного значения». Поэтому я думаю, что нам нужно переосмыслить вещи.
Идея состоит в том, чтобы создать один хэш для каждой записи. И когда запись заканчивается (когда мы получаем строку из тире), мы выводим эту запись. Примерно так:
[110] Шаг 3: Очистить вещи, удалив несколько ненужных переменных и превратив их в фильтр Unix (чтение из STDIN
и запись в STDOUT
) - это на самом деле легче писать и делает вашу программу гораздо более гибкой.
[111] Как уже упоминали другие, в производственном коде вы хотели бы использовать Text :: CSV для создания выходных данных.
, 2) {
# Some keys have their values on the next line
if ($value !~ /\S/) {
chomp($value = <>);
$value =~ s/^\s+//;
}
$record{$key} = $value;
}
}
Как уже упоминали другие, в производственном коде вы хотели бы использовать Text :: CSV для создания выходных данных.