電子書籍の厳選無料作品が豊富!

イラストレーターでjavascriptを実行させ、ローカルのtxtファイルから適した素材をaiファイル上に配置するといった自動化プログラムを作成したいと思っています。

具体的に言うと「test.txt」の中身が以下のような場合、
アメリカ,100,日本,50,スペイン,0
※国名は100以上のデータがありますが、順序は変わりません。数値は毎回変わります。

var map = {“アメリカ”: 100, “日本”: 50, “スペイン”: 0};
といった具合に連想配列として読み込ませる事は可能でしょうか。

イラレでtest.jsを読み込むとのaiファイル上であらかじめ作成したaiデータのテンプレートファイル上でアメリカの領域に100%の素材を配置、日本の領域に50%の素材を配置、スペインの領域には0%を配置するといったjavascriptを書きたいと思っています。テンプレート素材の再配置するスクリプトはあらかた出来上がっているのですが、ローカルのテキストファイルを連想配列として適切に読み込むjavascriptを書く事ができません。教えてください。お教願いします。

A 回答 (3件)

こんにちは



Adobeソフトのjavascriptは使ったことがない上に、Illustratorも無いという環境なのですが・・・(笑)

photoshopが手元にあったので、試してみました。
とは言っても「photoshopでスクリプトの実行ってどうやるんだぁ??」状態から始めましたので、かなりいい加減です。
とりあえず、Adobe製品に共通そうな以下を中心に参考にしました。
http://www.openspc2.org/reibun/AdobeJS/CS6/index …

他にはこのあたりを参考に
http://kurusugawa.jp/2008/03/27/adobe-illustrato …
http://wwwimages.adobe.com/content/dam/Adobe/en/ …

Illustratorとphotoshopではファイルの読み込み方法が違うという記事もありましたが、テストした限りでは、Illustrator用の記述とされている方法でphotoshopでも読み込めました。
http://qiita.com/IDs011da/items/73c5ade1862c65c3 …

他にも若干違うところがある可能性はありますが、Illustratorでも、ほぼほぼ近いところまで行けるのではないかと想像します。
テスト環境は
 Windows7 SP1
 Adobe Photoshop CS5 Ver12
です。


さて、本題です。

※ ご質問文では、テキストファイルが必ず1行なのか複数行もあり得るのか不明ですが、ひとまず複数行の場合は「改行」を区切り(カンマ)と同様に判断して処理するようにしています。
※ 全体を「テキストファイルを読み込んでオブジェクト化して返す」関数にしてありますので、
  var map = text2json(filePath);
 のように呼び出すことで、mapにオブジェクトとして取得できるはずです。
 filePathはフルパスでの指定が必要なようです。
※ ファイルが存在しない場合や内容が無い場合は、空のオブジェクトが返されます。
※ テキストファイル内のデータにクォーテーションが含まれる場合等までは配慮していません。とりあえず、ごく単純なカンマ区切りとして処理しています。

以下、ご参考まで。
(ここでは半角スペースが削除されるため、インデントを全角空白にしてありますのでご注意)

// test script( TextFile to JsonObject)

function text2json(p){
 var trim = function(t){ return t?(t.replace(/^ +/,"").replace(/ +$/,"")):""; }
 var o = {}, sep = ",";

 var fileObj = new File(p);
 if(fileObj.open("r")){
  var txt = fileObj.read();
  fileObj.close();

  txt = txt.replace(/\r\n/g, sep).replace(/\n/g, sep);
  txt = txt.split(sep);
  for(var i=0; i<txt.length; i+=2){
   var k = trim(txt[i]), v = trim(txt[i+1]);
   if(k != "") o[k] = v;  
  }
 }
 return o;
}
    • good
    • 0
この回答へのお礼

ありがとうございました。
まさに「テキストファイルを読み込んでオブジェクト化して返す」関数を書きたいのですが書いていただいたスクリプトをコピペしても出来ませんでした。私の実力不足です。もうちょっと粘ってみます。
ちなみに読み込むテキストファイルは1行にしようと思います。

お礼日時:2017/08/05 14:27

ANo1、2です。



>テキストとしては読み込めているようですが、
>連想配列のオブジェクトとして取り込めていないようです。
テキストに読み込めていれば、後は普通のスクリプトなので、失敗しにくいとは思うのですが……
file.read()直後にはtxtにテキストが読めていて、戻り値はどうなっているのでしょうか?
どこかでエラーが出ていますか?

短いスクリプトなので、逐次チェックしてもたいしたことはないと思いますが、正規表現の文法が違うとかかなぁ……
エラーの箇所が特定できたり、エラーの内容が分かれば、大きなヒントになるのですが・・・
    • good
    • 0
この回答へのお礼

出来ていました。
var map = {“アメリカ”: 100, “日本”: 50, “スペイン”: 0};
の後で100なら100.jpg、50なら50.jpgといった具合に判定させているのですが、最後の「return o;」の部分を、その判定するための連想配列まで組み込ましてやると正常に数値を拾ってきて動くことが出来ました。
本当にありがとうございました。また何かありましたらよろしくお願いします。

お礼日時:2017/08/08 01:27

ANo1です。



こちらもイラレでテストはしていませんので、どこか違うところがあるかも知れないとは予想のうちです。

No1のスクリプトでテキストの読み込みまではできているでしょうか?
それとも、読み込みで失敗しているのでしょうか?
エラーが出ているとして、どこでどのようなエラーなのでしょうか?

こちらでテストはできませんが、もう少しはお役に立てるかも知れません。
なお、No1にも記しましたが、ファイルパスはフルパスで指定する必要があるようですので、念のため。


>ちなみに読み込むテキストファイルは1行にしようと思います。
1行が保証されているなら、
 txt = txt.replace(/\r\n/g, sep).replace(/\n/g, sep);
の行は不要です。

また、テキストに無駄なスペースが無いことも保証されているなら、
 var trim = function(t){ ~~~ }
の関数も不要になります。
(関数を使用している部分の修正が必要ですが……)
    • good
    • 0
この回答へのお礼

ありがとうございます。テキストとしては読み込めているようですが、連想配列のオブジェクトとして取り込めていないようです。

お礼日時:2017/08/05 18:54

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!