
Tradosの翻訳メモリにある原文と訳文のペアを、Excelに持っていきたいと思ったことはありませんか?たとえば、原文や訳文などでソートしてメモリのメンテナンスに役立てたり、別の用途に利用したりしたいときなどです。
もしTradosに加えてMemsourceもお使いでしたら、Memsourceを使ってExcelに持っていくことができますし、Apsic Xbenchというツールを使うことでもExcelに持っていくことができます。
しかしここでは、そうした有料のツールを使わなくても、無償のツールだけでTradosの翻訳メモリをExcelに持っていく方法をご紹介します。
Tradosすら必要ありませんので「Tradosは持ってないけど、翻訳会社から納められた翻訳メモリの中身を見たい!」という方にも役立つテクニックです。
ここでは、Trados Studioの翻訳メモリであるsdltmファイルを対象に解説します。皆さんが、実際にこのようなやり方をすることはないとしても、翻訳メモリの内部構造を知ることもできますので、ご興味があればお読みください。
SQLiteを操作できるツールで翻訳メモリをCSVファイルにエクスポートする
sdltmファイルはSQLite形式で作成されているようで、SQLiteを操作できるツールであれば、中身を閲覧するなどの操作を行うことができます。
ここでは、SQLiteのデータベースを管理できるフリーソフトである「DB Browser for SQLite」を使うことにします。ネットで検索すればすぐにイントーラーが手に入りますので、まずはイントールしてください。
インストールしたら、これを起動し、以下の手順でsdltmファイルから、原文や訳文などのデータ部分をCSVファイルにエクスポートします。なお、下記の画面および操作はDB Browser for SQLiteのVersion 3.9.1のものです。
作業する際には、オリジナルのsdltmファイルを直接操作することは避けてください。万が一オリジナルを壊してしまうことのないよう、必ずコピーしたファイルをお使いください。
- DB Browser for SQLiteで[Open Database]ボタンを押します。
- ファイルを選択するダイアログが現れますが、このままではsdltmファイルが表示されませんので、[All files (*)]を選択します。
- 対象のsdltmファイルを選択し、[開く]ボタンを押します。
- Tablesの下にあるtranslation_unitsを選択して、[Modify Table]ボタンを押します。このtranslation_unitsというテーブルに、原文と訳文、登録・更新した日やユーザー名などが格納されています。
- Fieldsからguidを選択し、[Remove field]ボタンを押します。guidフィールドはバイナリデータが格納されていて、内容を見る上では要らないばかりか、この後CSVを処理することを難しくするので削除します。
- 削除していいか確認するメッセージが現れますので、[Yes]ボタンを押します。
- [OK]ボタンを押して、「Edit table definition」ウィンドウを閉じます。
- [File]メニューの[Export]から[Table(s) as CSV file]を選択します。
- attributesテーブルが選択されているので、これを選択してハイライトを消します。これをやらないと、attributesテーブルがエクスポートされてしまい、余分なファイル「attributes.csv」ができますが、あっても問題はありません。
- スクロールして、エクスポートする対象であるtranslation_unitsを選択します。
- 「Field separator」を「Tab」に変更して、[OK]ボタンを押します。「Field separator」のデフォルトはカンマで、それでも処理はできますが、タブにしておいたほうが、後ほどExcelに持っていきやすくなります。したがって正確に言うとCSVファイルではないのですが、ここではそう呼ぶことにします。
- エクスポート先を選んで、必要があればファイル名を変更し、[保存]ボタンを押します。
- エクスポートの完了を知らせるメッセージが現れたら、[OK]ボタンを押します。
- ウィンドウの[×]ボタンなどでDB Browser for SQLiteを終了させます。その際データベースを保存するかどうか訊かれますので、[No]ボタンを押します。前述したように、オリジナルのsdltmではなく、そのコピーを開いている場合には、そのコピーは不要になりますので、[Yes]ボタンを押しても問題はありません。
これでsdltmファイルから、原文や訳文などのデータ部分をCSVファイルにエクスポートすることができました。
テキストエディタでCSVファイルを加工する
エクスポートしたCSVファイルには翻訳メモリ特有のタグが含まれており、これらを削除したり変換したりしないと原文や訳文が大変読みにくい状態にあります。そこでExcelに持っていく前に、テキストエディタで以下の処理を行います。
- タグの削除
- 原文や訳文のフィールドには、以下のような翻訳メモリ特有のタグが含まれています。これらは文章を見るのに邪魔になるので削除します。
- <Segment xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
- <TagID>bold</TagID>
- <CultureName>en-US</CultureName>
- 特殊文字の置換
- 原文や訳文内には、「°」や「Ö」などの特殊文字が、以下のような独自のタグで表現されていることがあります。このままでは読みにくいので、これらを実際の文字に置換します。
- <TextEquivalent>deg</TextEquivalent>(「°」を表す)
- <TextEquivalent>Ouml</TextEquivalent>(「Ö」を表す)
- <TextEquivalent>copy</TextEquivalent>(「©」を表す)
ここではテキストエディタとして「サクラエディタ」を使いますが、同じことができるのであれば、他のテキストエディタをお使いになっても構いません。ネットで検索していただければ、すぐに見つかりますので、ダウンロードしてインストールしてください。なお、下記の画面や操作はサクラエディタのVersion 2.2.0.1のものです。
- サクラエディタを起動し、[開く]ボタンを押します。
- エクスポートしたCSVファイルを選択し、[開く]ボタンを押します。
- 文章の右端が切れて見にくい場合には、[設定]メニューの[折り返し方法]から[右端で折り返す]を選択します。
- [置換]ボタンを押します。
- まずタグの削除をしていきましょう。基本的には「置換前」に削除したいタグを入力し、「置換後」には何も入れず、その他のオプションを下図のように設定して、[すべて置換]ボタンを押していきます。
「置換前」に入力する文字列は、効率良く削除するために正規表現を使用します。たとえば上図で示した「置換前」の文字列「</?Segment[^>]*>」という正規表現は、以下いずれの文字列にも、すなわちSegment要素の属性がどのような記述であっても、また開始タグでも終了タグでもマッチすることになります。
<Segment xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
</Segment>
「/?」というのは、「/」が0文字か1文字という意味ですので、これによって<Segment>にも</Segment>にもマッチします。「[^>]*」というのは「>」以外の文字が0文字以上という意味ですので、これによって属性があってもなくても、また属性に何がきてもマッチすることになります。
もうひとつ効率の良さを感じる例を示しましょう。たとえば、<CultureName>en-US</CultureName>という要素は、CultureNameタグで囲まれた文字列によって、原文や訳文の言語を表しますが、当然言語によってそこが変わってくるわけです。
そうするとたとえば、まず<CultureName>en-US</CultureName>を削除し、次に<CultureName>it-IT</CultureName>を削除するというふうに、そのときどきの言語ごとに削除することになるわけですが、「<CultureName>[^<]+</CultureName>」という正規表現を使えば、どんな言語のときでも一度に削除できます。
「[^<]+」というのは、「<」以外の文字が1文字以上という意味ですので、これによって<CultureName>と</CultureName>の間がどんな文字列でもマッチします。
正規表現の詳しい説明はまたの機会に譲るとして、こちらで把握している限りでは、表1の順序で置換していくことで、きれいにタグを削除することができます。
表1 タグの削除手順*1:「置換前」と「置換後」に入力する文字列は、表示上折り返していても実際は1行であり、途中に改行が入るわけではありません。「置換前」に入力する文字列*1 「置換後」に入力する文字列*1 マッチする例や置換の意図 </?Segment[^>]*> <Segment xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
</Segment><Type>[^<]+</Type> <Type>Standalone</Type> <CanHide>[^<]+</CanHide> <CanHide>false</CanHide> <Anchor>[^<]+</Anchor> <Anchor>1</Anchor> <AlignmentAnchor>[^<]+</AlignmentAnchor> <AlignmentAnchor>1</AlignmentAnchor> <TagID>[^<]+</TagID> <TagID>bold</TagID> <CultureName>[^<]+</CultureName> <CultureName>en-US</CultureName> </?Elements> <Elements>
</Elements></?Text> <Text>
</Text></?Tag> <Tag>
</Tag><Value> + <Value> 「+」の前には半角スペースを1つ入れます。
この正規表現は「Valueの開始タグの直後に半角スペースが1文字以上あった場合」という意味です。
Valueタグは原文や訳文を直接囲むものなので、これによって原文や訳文の先頭にある半角スペースを削除することになります。<Value>- <Value>'- これは正規表現ではありません。単純に「Valueの開始タグの直後に『-(ハイフン)』があった場合に、ハイフンの前に『'(アポストロフィ)』を入れる」ための置換です。
これによってExcelに持っていったときに、数値として解釈されてしまうことを防ぎます。<Value>= <Value>'= これは正規表現ではありません。単純に「Valueの開始タグの直後に『=(半角イコール)』があった場合に、イコールの前に『'(アポストロフィ)』を入れる」ための置換です。
これによってExcelに持っていったときに、数式として解釈されてしまうことを防ぎます。*</?Value> 「*」の前には半角スペースを1つ入れます。
この正規表現は「直前に半角スペースが0文字以上ある、<Value>か</Value>」という意味です。
Valueタグは原文や訳文を直接囲むものなので、これによって原文や訳文の末尾に半角スペースがあればそれを削除するとともに、Valueタグ自体を削除することになります。([^\r])\n \1 この正規表現は「『\r(CR:キャリッジリターン)』以外の文字の次に『\n(LF:ラインフィード)』が来る場合、『\n(LF:ラインフィード)』を削除する」という意味です。
CSVファイルをエクスポートする際、データベース各行の改行コードは「CR:キャリッジリターン+LF:ラインフィード」で、セル(フィールド)内の改行コードは「LF:ラインフィード」になるように設定しています。
つまり原文や訳文の途中に改行がある場合、その改行コードは「LF:ラインフィード」になっています。これをExcelに持っていった際には、それがセル内改行として機能することになります。
ここでは、そもそも原文や訳文の途中に改行があること自体変なので、これを削除しています。ただ、もし途中に改行がある原文や訳文を探すことが目的ならば、削除しなくても構いません。 - 置換すると「~箇所を置換しました。」というメッセージが現れますので、[OK]ボタンを押します。そして「置換前」と「置換後」に入力する文字列を、上記表1の順序で入れ換えては置換するという行為を繰り返していきます。
- タグの削除が終わったら、次に特殊文字の置換をしていきます。まずどんなTextEquivalent要素があるか、その開始タグ「<TextEquivalent>」だけを「置換前」に入れて[下検索]ボタンを押します。
- 見つかった場合には黄色くハイライトされますので、開始タグの後の文字列(下図の例では「deg」)と終了タグ「</TextEquivalent>」を「置換前」に追加します。
これを何に置換するかを知るには、タグで囲まれた文字列がどのような文字なのかを調べる必要があります。該当の文章が実際に使われているデータを見ればわかりますが、無い、もしくは容易に探せない場合はどうすればいいでしょうか。
この文字列はHTMLで使われる文字実体参照とほぼ同じです。したがって、たとえば以下のような一覧を参考に、その実体参照を何の文字に置換したらいいかを調べることができます。
Character Entity Reference Chart
https://dev.w3.org/html5/html-author/charrefたとえば、上図の例にある「deg」の置換文字を探す場合、上記サイトの「°」のところにカーソルを当てます。すると、「°」という数値文字参照が現れます。
文字コード表を開き、「°」のうち、末尾の「;(セミコロン)」を除いた末尾4文字「00B0」を「Unicodeで指定」欄に入力します。するとそのコードに相当する文字(この場合「°」)がハイライトされます。
[選択]ボタンを押すと、その文字が「コピーする文字」欄に入ります。そうしたら[コピー]ボタンを押して、サクラエディタの「置換後」にCtrl+Vキーで貼り付けます。
その上で、[すべて置換]ボタンを押すと、<TextEquivalent>deg</TextEquivalent>を「°」に置換することができます。調べる手間を省くために、当方で経験したことのある、「置換前」と「置換後」の文字列例を表2に示します。
表2 TextEquivalent要素の置換*1:「置換前」に入力する文字列は、表示上折り返していても実際は1行であり、途中に改行が入るわけではありません。「置換前」に入力する文字列*1 「置換後」に入力する文字列 文字コード:文字名称 <TextEquivalent>sim</TextEquivalent> ∼ 223C: Tilde Operator <TextEquivalent>sup2</TextEquivalent> ² 00B2: Superscript Two <TextEquivalent>sup3</TextEquivalent> ³ 00B3: Superscript Three <TextEquivalent>ndash</TextEquivalent> – 2013: En Dash <TextEquivalent>ldquo</TextEquivalent> “ 201C: Left Double Quotation Mark <TextEquivalent>rdquo</TextEquivalent> ” 201D: Right Double Quotation Mark <TextEquivalent>rdquor</TextEquivalent> ” 201D: Right Double Quotation Mark <TextEquivalent>rsquo</TextEquivalent> ’ 2019: Right Single Quotation Mark <TextEquivalent>deg</TextEquivalent> ° 00B0: Degree Sign <TextEquivalent>times</TextEquivalent> × 00D7: Multiplication Sign <TextEquivalent>middot</TextEquivalent> · 00B7: Middle Dot <TextEquivalent>plusmn</TextEquivalent> ± 00B1: Plus-Minus Sign <TextEquivalent>Ouml</TextEquivalent> Ö 00D6: Latin Capital Letter O With Diaeresis <TextEquivalent>copy</TextEquivalent> © 00A9: Copyright Sign <TextEquivalent>rarr</TextEquivalent> → 2192: Rightwards Arrow <TextEquivalent>square</TextEquivalent> □ 25A1: White Square <TextEquivalent>trade</TextEquivalent> ™ 2122: Trade Mark Sign <TextEquivalent>reg</TextEquivalent> ® 00AE: Registered Sign <TextEquivalent>minus</TextEquivalent> − 2212: Minus Sign もちろん表2以外の特殊文字もあり得ますし、HTMLの文字実体参照では解決できない文字もあるかもしれません。その場合は実際に使用されているデータを確認する他ありません。
1つの特殊文字が置換できたら、再び「置換前」を「<TextEquivalent>」だけにして検索し、次の特殊文字を置換することを繰り返していきます。最終的に1つも見つからなくなれば、TextEquivalent要素の置換は終了です。
- 念の為「<」だけで検索して、未知のタグがないかどうか確認します。
- 最後に、TextEquivalent要素以外にも、表3のような文字実体参照の置換が必要な場合がありますので、検索して見つかったら置換していきます。
表3 文字実体参照の置換
「置換前」に入力する文字列 「置換後」に入力する文字列 文字コード:文字名称 < < 003C: Less-Than Sign > > 003E: Greater-Than Sign " " 0022: Quotation Mark ' ' 0027: Apostrophe & & 0026: Ampersand - 処理が終わったら、[名前を付けて保存]ボタンを押します。
- 「文字コードセット」を「Unicode」に変え、[保存]ボタンを押します。ここでいう「Unicode」とは「リトルエンディアンのUTF-16 」のことです。これにすると、タブ区切りのファイルを文字化けせずに直接Excelで開くことができます。
- ファイル名を変えなかった場合は上書きを確認するメッセージが現れますので、[はい]ボタンを押します。
- セル(フィールド)内改行の「LF:ラインフィード」を削除しなかった場合は、改行コードを統一するかどうか訊いてきますので、[いいえ]ボタンを押します。ここで改行コードを「CR+LF」に統一してしまうと、セル内改行ができなくなり、おかしなところでExcelの行が分かれてしまいますので、気をつけてください。
後はExcelで開くだけ
ここまで処理すれば、CSVファイルをダブルクリックすることで、そのままExcelで開くことができます。後は、idやtranslation_memory_id、source_hash、target_hash、usage_counter、flagsなど不要な列を削除し、形を整え、「名前を付けて保存」でxlsxファイルにすれば完成です。
いかがでしたでしょうか。こんな面倒なことするくらいなら、Apsic Xbenchでも購入したほうが早いと思われたかもしれませんね。ただ、ご紹介したようなデータベースの操作や正規表現などのテクニックをもっていると、色々なことに応用が効くと思いますので、ご興味があれば参考にしてください。