Как автоматизировать вставку полей внутри текстового файла? - PullRequest
0 голосов
/ 09 января 2012

Допустим, у вас есть набор файлов, содержащих строки, такие как:

{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; }
}

Хотя мое решение работает, оно работает не очень хорошо. Улучшения, пожалуйста!

Ответы [ 3 ]

1 голос
/ 09 января 2012

Если ваш ввод не содержит экранированной вертикальной черты, вы можете просто использовать split и splice:

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

Обратите внимание на использование -1 как LIMIT для split, чтобы оставить пустые поля в конце. Все пустые поля захватываются, поэтому вам не нужно добавлять дополнительную вертикальную черту в print.

0 голосов
/ 09 января 2012

Я предлагаю вам справиться с этим с помощью awk.

http://search.cpan.org/search?query=awk&mode=all

0 голосов
/ 09 января 2012

Избавьтесь от вьющихся подмигиваний ({};), назовите свои поля (полные, разумные):

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

Используйте DBI и DBD :: 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|
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...