разбирать текстовый файл построчно, затем помещать соответствующую строку в массив, затем выводить в файл csv

Несколько лет спустя просто добавить еще одно простое базовое 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
0
задан ggorlen 15 January 2019 в 22:51
поделиться

2 ответа

Поскольку вы не указали, как должен выглядеть результат на самом деле, я взял удар в темноте и сделал предположение, посмотрев на входные данные и ваши регулярные выражения.

Для получения кода качества продукции, пожалуйста, следуйте совету @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+(.+)$/;

внутри этого блока.

0
ответ дан Stefan Becker 15 January 2019 в 22:51
поделиться

Шаг 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 для создания выходных данных.

0
ответ дан Dave Cross 15 January 2019 в 22:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: