2012-01-09 66 views
0

比方說,你有一堆如下面包含行的文件:如何在文本文件中自動插入字段?

 
{yellow_forest_ant|monsters_insects:2|Yellow forest ant|forestant||5|||10|100|||2|2|15||insect|||||||||}; 
{small_rabid_dog|monsters_dogs:1|Small rabid dog|forestdog||6|||10|90|||2|2|||canine|||||||||}; 

而且你要插入的第5和第6場,其中一些新的內容,要看是什麼現有的域之間三個字段是。

你會如何以自動化的方式做到這一點? 在現有文本文件的行內插入一些動態內容。

我的解決方案(在Perl):

while(<>) { 
    if (/\{(.+?)\};/) { 
    my @v= $1 =~ /([^\|\{\}]*?|\{\{.*?\}\})\|/g; 
    my @output= (@v[0..4], guessMonsterClass($v[1]), $uniques{$v[0]}, '',@v[5..24]); 
    print '{'.join('|',@output)."|};\n"; 
    } else { print; } 
} 

雖然我的解決方案有效,它不能很好地工作。 改進請!

+1

只需將大括號內的字符串拆分到'/ \ | /'中,更改結果數組的元素,將''''上更改的數組加入並輸出。 – 2012-01-09 04:43:18

+1

爲什麼這個問題用'xml'標記?我沒有看到與XML相關的內容。 – choroba 2012-01-09 08:34:22

回答

0

擺脫了花眨眼({};)的,命名字段(完整性,合理性):

 
F1|F2|F3|F4|F5|F6 
yellow_forest_ant|monsters_insects:2|"Yellow forest ant"|forestant||5 
small_rabid_dog|monsters_dogs:1|"Small rabid dog"|forestdog||6 

使用DBIDBD::CSV

my $dbh = DBI->connect('dbi:CSV:', "", "", { 
     f_dir  => "../data" 
     , csv_sep_char => '|' 
     , PrintError => 0 
     , RaiseError => 1 
    }); 

    my $sth = $dbh->prepare('SELECT * FROM monsters.txt'); 
    $sth->execute; 
    while(my @row = $sth->fetchrow_array()) { 
    print '|', join('|', @row), "|\n"; 
    } 

    $sth = $dbh->prepare("UPDATE monsters.txt SET F5 = F6 * 2 WHERE F4 = 'forestant'"); 
    $sth->execute; 

    $sth = $dbh->prepare('SELECT * FROM monsters.txt'); 
    $sth->execute; 
    while(my @row = $sth->fetchrow_array()) { 
    print '|', join('|', @row), "|\n"; 
    } 

輸出:

 
|yellow_forest_ant|monsters_insects:2|Yellow forest ant|forestant||5| 
|small_rabid_dog|monsters_dogs:1|Small rabid dog|forestdog||6| 
|yellow_forest_ant|monsters_insects:2|Yellow forest ant|forestant|10|5| 
|small_rabid_dog|monsters_dogs:1|Small rabid dog|forestdog||6| 
1

如果輸入不包含轉義豎線,你可以只使用splitsplice

while (<>) { 
    if (/\{(.+?)\};/) { 
     my @v = split /\|/, $1, -1; 
     splice @v, 5, 0, guessMonsterClass($v[1]), $uniques{$v[0]}, ''; 
     print '{', join('|', @v), "};\n"; 
    } else { 
     print; 
    } 
} 

注-1使用的限制split保持空字段在結束。所有空白字段都被捕獲,因此您不需要在print中添加額外的垂直條。

相關問題