2011-09-30 209 views
0

我有兩個文件來自兩個不同的服務器。在這兩個文件中提供了一些橄欖球隊的比賽。如你所知,橄欖球隊可以用不同的名字命名。 我想實現一個代碼,可以在兩個文件中識別相同的足球比賽,以便從文件中獲取相同的變量,而從另一個文件中獲取其他變量。 例如在一個文件中,我有一個叫做比賽模式識別和字符串匹配

Derry City - Bray Wanderers 

,並在其他文件中我有一個叫做

Derry City - Bray 

我怎麼能做到這一點同樣的比賽? 我沒有想法。

+3

說真的,**沒有**的想法呢?甚至不完整,或錯誤或天真的? –

+0

唯一天真的想法是用搜索解析一個文件並用sed或perl替換子例程。但是對於每個新的團隊,我都必須手動修復文件。 – emanuele

回答

1

非常簡單的腳本來替換團隊的別名。你需要自己填寫別名,我做了一些。如果你有多個遊戲,只要所有的別名交換完整的名字,哈希將覆蓋現有的遊戲。

#!/usr/bin/perl 
use strict; 
use warnings; 

my %games; 
while (<DATA>) { 
    chomp; 
    my ($home, $guest) = split /\s*-\s*/, $_, 2; 
    $home = get_name($home); 
    $guest = get_name($guest); 
    $games{"$home - $guest"} = 1; 
} 

sub get_name { 
# Return the full name for the team, if it exists, otherwise return the original 
    my %alias = (
     'Derry'  => 'Derry City', 
     'Brawlers' => 'Beijing', 
     'Dolphins' => 'Miami', 
     'Bray'  => 'Bray Wanderers', 
    ); 
    return $alias{$_[0]} // $_[0]; 
} 

use Data::Dumper; 
print Dumper \%games; 

__DATA__ 
Derry City - Bray Wanderers 
Derry City - Bray 
Brawlers - Dolphins 
Beijing - Miami 
Miami - Beijing 
1

在C++中:看看Boost.RegexBoost.Tokenizer,因爲他們會做你所需要的。所有你需要的是一種模式來匹配。

boost::regex("Bray[\s]*(Wanderers)?", boost::regex::icase); 

或類似的東西 - 容易設置爲一組單元測試。