tldr; 如何交换帐户并删除减号
该文件包含这样的多个事务
输入:
2018/01/08 * Aldi
; MD5Sum: a587a267588505265ae437c43c978886
; CSV: 2018-1-8,aldi,40.85
Expenses:Groceries
Expenses:Unknown USD -40.85
; :Groceries:
预期产量:
2018/01/08 * Aldi
; MD5Sum: a587a267588505265ae437c43c978886
; CSV: 2018-1-8,aldi,40.85
Expenses:Groceries USD 40.85
Expenses:Unknown
; :Groceries:
请注意,最右边的金额已被取反,它是附加到Expenses:Groceries
而不是Expenses:Unknown
。
使用perl的最简单方法是一次读取所有数据,将其拆分为节,大概在行的开头以4位数字开头,然后分别对每个节进行操作。由于未在问题中完全指定数据,因此对数据进行了假设。
#!/usr/bin/perl
use strict;
my $data = join("", <>);
my @stanzas = split(/^(?=\d{4})/m, $data);
foreach my $st (@stanzas){
if($st =~ m/Expenses:(?!Unknown)\S+\s*$/m){
if($st =~ m/Expenses:Unknown\s+(USD\s+-[0-9.]+)/){
my $amount = $1;
$amount =~ s/-//;
$st =~ s/Expenses:(?!Unknown)(\S+)(\s*)$/Expenses:$1 $amount/m;
$st =~ s/Expenses:Unknown(\s+USD\s+-[0-9.]+)/Expenses:Unknown/;
}
}
}
print join("", @stanzas);
在这里,该split()
函数使用预(?=)
读模式将整个输入分割为4位数字的行。
对于每个节,如果它的“支出”不为“ Fenses”,然后为“ Unknown”,则为非空格,然后仅是空格,“ Unknown”为负,后跟一个负数,则将捕获该数字及其前面的USD,并减去负号。
结果将替换为具有一定固定空间量的第一条匹配行,并从未知行中删除。单独执行此操作可以使这两个字段在节中的顺序不同。
最后,将节连接并打印。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句