【问题标题】:Part of filename to the CSV file using Perl使用 Perl 的 CSV 文件的部分文件名
【发布时间】:2013-12-05 21:51:49
【问题描述】:

具有以下输入文件:Green_*.csvRed_*.csvBlue_*.csvYellow_*.csv 如何提取颜色名称。我正在尝试以下代码:

sub putInColumn {
    my $filename = getFilename(@_);
    my @name = split '_', $filename;
    if ( $name[0] eq 'Green' )    { return 'Green'; }
    if ( $name[0] eq 'Red' )   { return 'Red'; }
    if ( $name[0] eq 'Blue' ) { return 'Blue'; }
    if ( $name[0] eq 'Yellow' )   { return 'Yellow';}
    return 'error';
}

...但我得到错误。我想要实现的是将颜色名称放在这个 csv 文件中。 非常感谢任何帮助。

【问题讨论】:

  • print $filename; 进行一些基本调试

标签: perl csv filenames


【解决方案1】:

你可以试试这样的:

our @arrColors = ('red', 'green', 'etc');

sub putInColumn {
    my $filename = shift;
    $filename =~ /^([^_]+)/;
    my $color = $1;
    return $color if(grep(/$color/i, @arrColors));
    return 'error';
}

【讨论】:

  • @Richard,您的示例不适用于包含多个“_”的文件名:例如 - red_some_thing.csv 与颜色名称不匹配。
【解决方案2】:

你可以用这个:

my ($color) = ($filename =~ m/^(\w+)_.*\.csv/i);

注意 $color 周围的括号 - 我使用 =~ 正则表达式运算符中的 LIST 上下文将正则表达式中的组返回到变量列表中。所以(\w+)会被复制到$color中。

这大致翻译为:

my $color = undef;
if ( $filename =~ m/^([^_]+)_.*\.csv/i ) {
  $color = $1;
}

【讨论】:

  • \w+_ 的基本错误是\w 包含下划线,而+ 量词是贪婪的,因此默认情况下您将始终匹配到字符串中的最后一个下划线。你会想要[^_]+
  • 是的,我是这么认为的。固定!
  • 你也应该知道用undef初始化一个新变量是不需要的。
  • 我知道,我只是很明确。
【解决方案3】:

你应该考虑一些更动态的东西。如果你要匹配的只是颜色,那为什么不匹配颜色呢?

my @cols = qw(green red blue yellow);
my $rx   = join "|", @cols;
$rx = qr#\b($rx)\b#;
...
sub check_col {
    return $_[0] =~ /$rx/ig;
}

注意在颜色名称周围使用\b 将避免部分匹配。

还要注意修饰符 /i 的使用,它将不区分大小写匹配,/g 在这种情况下将返回所有匹配的字符串。像这样的解决方案将使您在使用的返回值方面具有一定的灵活性

if (check_col($foo))            # false means no colour found
$found = check_col($foo);       # same thing
$count = () = check_col($foo);  # returns number of colours found
@cols = check_col($foo);        # a list of all colours names found
my ($col) = check_col($foo);    # take first colour found

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-12
    • 1970-01-01
    • 2020-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-31
    • 1970-01-01
    相关资源
    最近更新 更多