Это продолжение вопроса, размещенного здесь: синтаксис Perl Regex
В результате этого обсуждения был получен следующий сценарий:
#!/usr/bin/env perl
use strict;
use warnings;
my @lines = <DATA>;
my $current_label = '';
my @ordered_labels;
my %data;
for my $line (@lines) {
if ( $line =~ /^\/(.*)$/ ) { # starts with slash
$current_label = $1;
push @ordered_labels, $current_label;
next;
}
if ( length $current_label ) {
if ( $line =~ /^(\d) "(.*)"$/ ) {
$data{$current_label}{$1} = $2;
next;
}
}
}
for my $label ( @ordered_labels ) {
print "$label <- as.factor($label\n";
print " , levels= c(";
print join(',',map { $_ } sort keys %{$data{$label}} );
print ")\n";
print " , labels= c(";
print join(',',
map { '"' . $data{$label}{$_} . '"' }
sort keys %{$data{$label}} );
print ")\n";
print " )\n";
}
__DATA__
...A bunch of nonsense I do not care about...
...
Value Labels
/gender
1 "M"
2 "F"
/purpose
1 "business"
2 "vacation"
3 "tiddlywinks"
execute .
По сути, мне нужно собрать Perl, чтобы приспособить сокращенный синтаксис, найденный в файле SPSS. Для соседних столбцов SPSS позволяет ввести что-то вроде:
VALUE LABELS
/agree1 to agree5
1 "Strongly disagree"
2 "Disagree"
3 "Neutral"
4 "Agree"
5 "Strongly agree"
Поскольку скрипт в настоящее время существует, он сгенерирует это:
agree1 to agree5 <- factor(agree1 to agree5
, levels= c(1,2,3,4,5,6)
, labels= c("Strongly disagree","Disagree","Neutral","Agree","Strongly agree","N/A")
)
и мне нужно, чтобы он произвел что-то вроде этого:
agree1 <- factor(agree1
, levels= c(1,2,3,4,5,6)
, labels= c("Strongly disagree","Disagree","Neutral","Agree","Strongly agree","N/A")
)
agree2 <- factor(agree2
, levels= c(1,2,3,4,5,6)
, labels= c("Strongly disagree","Disagree","Neutral","Agree","Strongly agree","N/A")
)
…
agree1
? Можете ли вы уточнить, с какой частью у вас возникли трудности? - person Ether   schedule 09.08.2010\var1 to varN
. В настоящее время сценарий обрабатываетvar1 to varN
как одну переменную, когда ему нужно создать новые переменные дляvar1, var2, var3, varN
. - person Chase   schedule 09.08.2010