2016-11-15 303 views
0

我想閱讀一個文本文件,並做一些分裂的文件,目的是將數據添加到數據庫中。 文本文件看起來像。Perl閱讀文本文件

object-group network og-net-network-hostname-blah 
description blah 
network-object host 192.168.0.1 
network-object host 192.168.0.2 
network-object host 192.168.0.3 
network-object host 192.168.0.4 
network-object host 192.168.0.5 
network-object host 192.168.0.6 
object-group network og-net-network-hostname-anotherblah 
description blah2 
network-object host 192.168.1.1 
network-object host 192.168.1.2 
network-object host 192.168.1.3 
network-object host 192.168.1.4 
network-object host 192.168.1.5 
network-object host 192.168.1.6 

我想要添加到數據庫中的內容如下。

Column Name => og-net-network-hostname-blah,og-net-network-hostname-anotherblah 
Column Description => blah,blah2 
`Column Objects =>192.168.0.1...,192.168.1.1... 
`Column Objects =>192.168.0.1...,192.168.1.1... 

到目前爲止,我已經能夠打開文件讀取它並做一個拆分,但它根本不可擴展。我最想做的是在對象組和下一個對象組之間進行任何操作,將該對象組的各種值作爲數組的一部分放入數組中。

回答

2

您可以使用下面的數據結構。它形成良好,易於訪問。

#!/usr/bin/perl 
use strict; 
use warnings; 
use Data::Dumper; 

my $filename = 'file.txt'; 
open (my $fh, "<", $filename) or die $!; 

my %data_for_object; 
my $key; 

while(<$fh>){ 
    chomp; 
    if ($_ =~ /object-group network (.*)/){ 
     $key = $1; 
    } 
    else{ 
     if ($_ =~ /description (.*)/){ 
      $data_for_object{$key}{description} = $1; 
     } 
     if ($_ =~ /network-object host (.*)/){ 
      if (exists $data_for_object{$key}{host}){ 
       push @{$data_for_object{$key}{host}}, $1; 
      } 
      else{ 
       $data_for_object{$key}{host} = [$1]; 
      } 
     } 
    } 
} 

print Dumper \%data_for_object; 

輸出:

$VAR1 = { 
      'og-net-network-hostname-blah ' => { 
               'host' => [ 
                  '192.168.0.1', 
                  '192.168.0.2', 
                  '192.168.0.3', 
                  '192.168.0.4', 
                  '192.168.0.5', 
                  '192.168.0.6' 
                 ], 
               'description' => 'blah' 
              }, 
      'og-net-network-hostname-anotherblah ' => { 
                 'host' => [ 
                    '192.168.1.1', 
                    '192.168.1.2', 
                    '192.168.1.3', 
                    '192.168.1.4', 
                    '192.168.1.5', 
                    '192.168.1.6' 
                   ], 
                 'description' => 'blah2' 
                } 
     }; 

另見:

+1

這是神奇的歡呼隊友。 –

+0

正如一個額外的問題,我將如何那麼所有的主機添加到數據庫中,我有DB連接工作和正確輸入所有其他的東西,但不是所有的主機。似乎只添加主機部分的一個主機。似乎是將第一個主機添加到一個數組,然後將所有其他主機添加到另一個數組,它使用Data :: Dumper打印出來的效果不錯,但不能用於插入到數據庫中? –