2011-07-23 12 views
1

私は、インディーズゲームDwarfFortressのMODを開発する最終段階にあります。モッドが正常に動作する前に最後に必要となるのは、ドワーフ要塞のRAWを変更することです。ゲームに投入される数百のクリーチャーに関する情報を含むテキストファイルが20個ほどあります。テキストファイルのディレクトリ内の単語の検索と置換

これは技術的な観点から、テキストファイルのディレクトリを通過し、基本的に「検索と置換」操作を実行して各行を変更します。

私のプログラミング経験のほとんどは、オブジェクト指向言語(C#とJava)、そしてAssemblerとCの経験です。しかし、これらの言語はこの種のタスクには最適ではありません。

Dwarf Fortress RAWが書かれているため、非常にシンプルな置き換えであるという点で、テキストファイルをさらに下げるまで行を置換する必要があるかどうかはわかりません。以下に、簡略化されたシナリオの例を示します。

[CREATURE:WOLF] 
    ... 
    [Many irrelevant lines of tokens] 
    ... 
[BODY_DETAIL_PLAN:STANDARD_MATERIALS] 
[BODY_DETAIL_PLAN:STANDARD_TISSUES] 
    ... 
    [Many more irrelevant lines of tokens] 
    ... 
[MULTIPLY_VALUE:2] 

私は[MULTIPLY_VALUE:X]に通読できるようにするニーズを書きたいプログラムライン、その後戻って、[BODY_DETAIL_PLAN:Z]を含む二行置き換える[BODY_DETAIL_PLAN:Y]とを、 Yは、Xの読み取り値に依存して変化するところ

私は二つのことを保証することができますで

  • 最も 1 [MULTIPLY_VALUE:X]の行の間に表示されます[CREATURE:A]と[CREATURE: B]または[CREATURE:Z]とファイルの末尾に入力します。
  • の[BODY_DETAIL_PLAN:Z]行の後に、[MULTIPLY_VALUE:X]行が常にになります(存在する場合)。

私が持っているコーディング経験に基づいて、実行可能なアイデアに最も近いのは、読み込み線の位置を '保存'するポインタを使用してファイルを読み込むCプログラムを作成し、ファイルリーダーは新しいRAWの開始を検出します。無粋として私を打つし、検索を実行するには経験がない私のトラブルに実行されます

しかし、/最初の場所でC関数(または任意の言語)を交換してください。

手作業で各テキストファイルを調べるという単調な作業を実現するための簡単な方法はありますか?私は全く新しいプログラミング言語を学びたいと思っていますが、どの言語がこの状況を処理するのが最も簡単かはわかりません。

提案?

+1

Perl、Python、Rubyなどのスクリプト言語に最適なタスクのようです。それらの言語は、朝食のためにそのようなことをします。しかし、1つの質問..ファイルのどこか他の場所にMULTIPLY行がありますか?私。あなたはCREATUREセグメントでそれを見つけるためにインテリジェンスを必要としますか、ファイル全体の任意のMULTIPLY行でブラインドを置き換えることができますか? – Casper

+0

@Casper - はい、私はスクリプト言語がうまくいくかもしれないと思っていましたが、スクリプト言語の経験はありません。問題は、置き換える必要のあるMULTIPLY行ではなく、MULTIPLY行の存在が別の行を*で置き換えるべきかどうかを指定することです。 –

答えて

1

私が前に質問した理由は、置き換えられる行の文脈が重要かどうかを知りたかったからです。コンテキストが重要でない場合、再帰的置換の全体は、ほとんどが1ライナープログラムになります。

あなたの答えに基づいて、私は文脈を考慮する必要があると仮定しています。だから、ここではRubyの簡単な例があります。例のように、どのように動作するかを見ることができます。コードはあなたがそれをよりよく理解するのを助けるために少し冗長です。あなたはそれをベースとして使用し、そこから作業することができます。

プログラムは、このように動作します - あなたはそうのようなデータファイルdata.txtを持っているとしましょう:あなたがプログラムを実行

[aaa] 
[bbb] 
[replace:a] 
[replace:b] 

[start_marker] 
    [xxx] 
    [replace:x] 
    [replace:y] 
    [yyy] 
[end_marker] 

[replace:c] 
[replace:d] 
[ccc] 
[ddd] 

ruby replace.rb data.txt 

をそして、あなたは、元のデータとdata.txt.bakで終わります交換されたdata.txtは次のようになります。

[aaa] 
[bbb] 
[replace:a] 
[replace:b] 

[start_marker] 
    [xxx] 
    [replace:x was replaced!] 
    [replace:y was replaced!] 
    [yyy] 
[end_marker] 

[replace:c] 
[replace:d] 
[ccc] 
[ddd] 

プログラムreplace.rb

require 'rubygems' 
require 'ftools'   # File.move 
require 'extensions/io' # File.writelines 

file = ARGV.shift 
lines = File.open(file).readlines 

replace_these = Array.new 
within_section = false 

# Loop until we hit start_marker, then store potential 
# lines until we hit end_marker, then fix the lines 
lines.each { |line| 
    within_section = true if line.match /\[start_marker\]/ 

    if line.match /\[end_marker\]/ 
    within_section = false 

    replace_these.each { |line| 
     # Do something clever... 
     line.gsub!(/:(\w+)/, ':\1 was replaced!') 
    } 

    replace_these = Array.new 
    end 

    next if !within_section 

    # Store lines to be replaced for later processing 
    replace_these << line if line.match /\[replace:.*\]/ 
} 

# Make a backup of the original file 
File.move(file, "#{file}.bak") 

# Overwrite the original with the new data 
File.writelines(file, lines) 

Rubyがでプログラムする楽しさ、言語、およびあなたの「ツールベルト」に持っている素晴らしい追加です。あなたが見てみたいことかもしれません。

+0

私はあなたのサンプルプログラムを実行しようとしていますが、コードの先頭に 'require'を使用して問題が発生しています。あなたが使っている 'ftools'と' extensions/io'の両方は私がプログラムを試して実行するときに "no such file"例外を与えています。 Ruby 1.9.2p290を使用しています。 –

+0

1.9では 'ftools'は' fileutils'に置き換えられていますので、それを使用してください。 '拡張機能'では 'gem install extensions'をインストールします。そうでなければ' rvm'、 'sudo gem install extensions'を使います。 – Casper

+0

拡張機能がインストールされていると思いますが、今は新しいエラーが発生しています: "初期化されていない定数オブジェクト:: VERSION(名前エラー)"私の 'require'ステートメントのどこかにタイプミスがあるかどうか確認しています。 –

関連する問題