0

2つのテキストファイルがあります。</sup><sup>タグの間の最初のテキストからテキストを取得し、の間の別のテキストファイルに挿入したいと思います{}

より良い例(辞書のようなもの)

Text1:

<sup>1</sup>dog
<sup>2</sup>cat
<sup>3</sup>lion
<sup>1</sup>flower
<sup>2</sup>tree
.
.

Text2:

\chapter1
\pkt{1}{}{labrador retirever is..}
\pkt{2}{}{home pets..}
\pkt{3}{}{wild cats..}
\chapter2
\pkt{1}{}{red rose}
\pkt{2}{}{lemon tree}
.
.

What I want:

Text3:

\chapter1
\pkt{1}{dog}{labrador retirever is..}
\pkt{2}{cat}{home pets..}
\pkt{3}{lion}{wild cats..}
\chapter2
\pkt{1}{flower}{red rose}
\pkt{2}{tree}{lemon tree}

テキストはランダムですが、あなたは私が欲しいものを見ることができます。Perlが最適です。

だから取得

</sup>**text**<sup>

に貼り付けます

\pkt{nr}{**here**}{this is translation of this word already stored in text2}.

テキストAとBが順番に並んでいるので、最初</sup>text<sup>にテキストAから読み取り、一時的に保存し、この行をテキストAから削除し{}、テキストBの最初の空きスロットに配置して、最初からやり直すことができれば素晴らしいと思います。順序が保存されるため、番号は一致します。私の英語でごめんなさい:)ありがとう!

4

1 に答える 1

2

このコードは、すべてのdictアイテムを表示順に配列に配置します。次に、texファイルがループされ、\ pkt {num} {}がヒットするたびに、配列の項目が挿入されます。

dictの改行は処理され、スペースに置き換えられます(この動作が必要ない場合は、マップでこの置換を削除するだけです)。\ pkt {num} {}の部分が複数の行にまたがっていない限り、\pktを見つける必要があります。それ以外の場合、最も簡単な解決策は、$ /(入力レコードの区切り文字)をundefし、ファイル全体を文字列に読み込んで、置換をループすることです(ただし、メモリが少し必要になる可能性があります)。

#!/usr/bin/perl -wT

use strict;

my $dict_filename = 'text1';
my $tex_filename = 'text2';
my $out_filename = 'text3';

open(DICT, $dict_filename);
my @dict;
{
    # Set newline separator to <sup>
    local $/ = '<sup>';
    # Throw away first "line", it will be empty
    <DICT>;
    # Extract string and throw away newlines
    @dict = map { $_ =~ m@</sup>\s*(.*?)\s*(?:<sup>|$)@s; $_ = $1; $_ =~ s/\n/ /g; $_; } <DICT>;
}
close(DICT);

open(TEX, $tex_filename);
open(OUT, ">$out_filename");

my $tex_line;
my $dict_pos = 0;
while($tex_line = <TEX>)
{
    # Replace any \pkt{num}{} with \pkt{num}{text}
    $tex_line =~ s|(\\pkt\{\d+\}\{)(\})|$1$dict[$dict_pos++]$2|g;

    print OUT $tex_line;
}

close(TEX);
close(OUT);
于 2011-05-01T15:00:35.283 に答える