2017-07-26 98 views
0

i後解析大.sql文件這是從一個%hashtable打印輸出的:更新和在哈希表中創建新的元素

Key:AS_LINR 

Value: 
Name:DS_LSNE_DDD_TS_A 

Type:view 




Parents:DM_LINE_END MINA_TI_GRP_V 

這是%hash

$hashtable{$name}="Name:$name 

Type:$type 




Parents:@parents"."\n\n 




". 


"----------------------------" 
; 

我需要請檢查每位家長,如果他在%hash中存在key。如果他這樣做,我需要更新和添加新的申請命名的孩子:,我會添加一個值到外地孩子在那裏我第一次發現父。就像本例中的名稱:

Key:DM_LINE_END 

Value: 
Name:DS_LSNE_DDD_TS_A 

Type:view 
Children:AS_LINR 

而且我需要爲每個家長做這件事。我想通過添加新元素來更新散列,如果has的鍵不存在,我必須創建一個。 如果我必須更好地解釋我要做的事情,請在評論中提問。

這裏是我的Perl代碼:

my $var=0; 
my @joinparents=(); 

use warnings; 

my %hashtable; 
open(DATA,'<','NaViews.sql') or die "Error $!"; 
open(Writer,'>','ResultFile.txt') or die "Error $!"; 
open(Writer1,'>','AuxResult.txt') or die "Error $!"; 

my @create_cmds =(); 
my $create_cmd = ""; 
READ_DATA : while (<DATA>) { 
    chop; 
    my $ln = $_; 

    $ln =~ s/^\s+//; 
    $ln =~ s/\s+$//; 
    next READ_DATA if($ln =~ /^\-\-/); 
    next READ_DATA if($ln =~ /^REM/); 

    if($create_cmd ne "") { 
     $create_cmd = $create_cmd." ".$ln; 
    } 

    if($ln =~ /^create/i) { 
     $create_cmd = $ln; 
    } 
    elsif($ln =~ /\;$/) { 
     push @create_cmds, $create_cmd; 
     $create_cmd = ""; 
    } 
} 

close DATA; 

my @views =(); 

foreach my $create_cmd (@create_cmds) { 
    $create_cmd =~ s/\s+/ /; 
    $create_cmd =~ s/^\s+//; 
    $create_cmd =~ s/\s+$//; 
    my $name = get_view($create_cmd); 

    my $type = get_type($create_cmd); 
    my $content = substr($create_cmd, 0, -1); 
    my @parents =();#get_parents(); 
    my @children =();#get_children(); 

#------------------------------------------------------------------------ 
    my @froms = split(/ from\s+/i, $create_cmd); 
    my @joins = split(/ join /i, $create_cmd); 

    #parcurge mai multe for in aceeasi structura 
    #FOR FROM 

     # body... 

    foreach my $i ([email protected]) { 
     #print Writer1 "$froms[$i]"."\n\n"; 

     my $from = (split(/ where |select | left | left | right | as /i, $froms[$i])) [0]; 
     $from=~s/^\s+//; 
     $from=~s/\(+//; 


     my @Spaces = split(/, | , /,$from); 
      foreach my $x ([email protected]) { 
       my $SpaceFrom = (split(/ /,$Spaces[$x])) [0]; 
       $SpaceFrom=~s/;//; 
       $SpaceFrom=~s/\)+//; 
      #print Writer1 $SpaceFrom."\n\n"; 
       push(@parents,$SpaceFrom); 

     #  print "\n\n".$SpaceFrom."\n\n"; 
     #  print Writer "\n\n".$SpaceFrom."\n\n"; 

      } 
    foreach my $x ([email protected]){ 
     #print "$joins[$i]"."\n\n"; 

      my $join = (split(/ on /i,$joins[$x])) [0]; 
      my $joinspace = (split(/ /i,$joins[$x])) [0]; 
      #print Writer "\n\n".$join."\n\n"; 
      #print Writer1 $joinspace."\n\n"; 
      #"$joinspace\n\n"; 
      push(@parents,$joinspace); 

     print Writer1"\n\n".$parents[$_]."\n\n"; 

    } 

     } 

     push @views, [$name, $type, $content, @parents, @children]; 

     $hashtable{$name}="[0]Name:$name 
[1]Type:$type 


[2]Content:$content 

[3]Parents:@parents"."\n\n 




". 


"----------------------------"; 


} 


print Writer "Key:$_ 
Value: 
$hashtable{$_}\n" foreach (keys%hashtable); 

#------------------------------------------------------------------------------ 

print_views(\@views); 


exit; 



#------------------------------------------------------------------------------ 
sub get_view { 
    my $create_cmd = $_[0]; 
    my $tmp = (split(/ view | trigger | table /i, $create_cmd))[1]; 
    $tmp =~ s/^\s+//; 
    my $view = (split(/\s+/, $tmp))[0]; 
    return $view; 
} 
#----------------------------------------------------------------------------- 
sub get_type{ 
    my $create_cmd = $_[0]; 
    my $tmp = (split(/ replace /i, $create_cmd))[1]; 
    $tmp =~ s/^\s+//; 
    my $view = (split(/\s+/, $tmp))[0]; 
    return $view; 
} 
#----------------------------------------------------------------------------- 
sub get_parents { 

} 
sub get_children { 



    } 



get_children(); 


close Writer1; 
close Writer; 

這是一個數據塊,我有如何解析的樣子:如果你想輕鬆地找出父母的

create or replace view MINA_TI_GRP_V 
as 
select NVL(max(t1.interval_group),(select dm_group from sdate_dm_grp_v)) AS DM_GROUP, 
    (t2.interval_number) INTERVAL_NUMBER , t2.time_interval_s 
    from MINA_INTERVAL_CONTROL t2 
    left join DM_TI_GRP_DATE_TIME t1 on t2.time_interval_s >= t1.time_interval_s 
    group by t2.interval_number , t2.time_interval_s 
    order by t2.interval_number; 
+2

哪裏是你的代碼? – Toto

+1

你的Perl代碼在哪裏?我們需要[mcve]添加到問題中,以便我們知道您要做什麼 –

+0

我向您詢問了perl代碼並且編輯您的問題,而不是在註釋中放置一些代碼。這是不可讀的。 – Toto

回答

1

%hashtable的條目中,如果將數據存儲爲另一個散列而不是像這樣的一個巨型字符串,則會更容易...

$hashtable{$name}={"Name" => $name, "Type" => $type, "Parents" => \@Parent}; 

然後,你可以參考$hashtable{$key}->{"Parents"}得到包含父母,你可以使用像這樣的數據輸入一個數組引用...

foreach my $parent (@{$hashtable{$key}->{"Parents"}}) 
    { 
    if(defined($hashtable{$parent})) 
    { 
    # Parent exists in hashtable 
    } 
    else 
    { 
    # Parent does not exist in hashtable 
    } 
    }