【发布时间】:2017-04-13 14:35:16
【问题描述】:
我一直在构建一个脚本,以从 IBM 的 SPSS Statistics 包中获取一些输出并将其转换为 SPSS 输入语法。我目前遇到以下问题,我似乎无法弄清楚。我有一些如下所示的文本:
VALUE LABELS V10
-1
1 "Yes".
VALUE LABELS V11
-50.00
-33.33
-10 "Don't Know".
我想用标有“-9 "Missing"' 的标签替换引号中没有跟标签并且没有空格缩进的负值,然后我想捕获其中的每一个散列中的负值以及变量名称(即 V10、V11),以便我稍后可以在重新编码语句中打印它们。我正在通过 perl 读取此文件,将“行”按文字句点拆分,然后是一个新行(这表示 SPSS 中命令的结束)。但是,到目前为止我提出的代码只是替换和捕获每个“行”的一个负值匹配,我不确定我做错了什么。我当前的代码如下所示:
my %negmiss;
my @lines = split(/(\.\n)/,$_);
foreach my $line (@lines) {
my $modline = $line;
if ($line =~ /VALUE LABELS\s(\S+)/g) {
my $label_name = $1;
if ($line =~ /\n(-\d+(\.\d+)?)\n/g) {
$modline =~ /\n(-\d+(\.\d+)?)\n/\n -9 \"Missing\"\n/g;
push my @negname, $label_name;
push @{$negmiss{$label_name}}, $1;
}
}
print $modline;
}
foreach (@negname) {
print "RECODE $_ (@{ $negmiss{$_} } = -9\.\n";
}
它部分有效,但同样,它只是为每个“行”替换和捕获一个负值,所以我的输出如下所示:
VALUE LABELS V10
-9 "Missing"
1 "Yes".
VALUE LABELS V11
-9 "Missing"
-33.33
-10 "Don't Know".
RECODE V10 (-1 = -9).
RECODE V11 (-50.00 = -9).
如何捕获和替换 V11“行”的 -50.00 和 -33.33?
编辑:我希望我的输出如下所示:
VALUE LABELS V10
-9 "Missing"
1 "Yes".
VALUE LABELS V11
-9 "Missing"
-9 "Missing"
-10 "Don't Know".
RECODE V10 (-1 = -9).
RECODE V11 (-50.00 = -9).
RECODE V11 (-33.33 = -9).
【问题讨论】:
-
鉴于输入,您的输出应该是什么样的?
-
已编辑帖子以显示输出应该是什么样子。
标签: regex perl pcre regex-group