特定文字を含む行に対する置換No.09796
tack さん 22/03/28 21:05
 
お世話になっております。
キーマクロもしくはマクロで


"target_id":"xxxx"
"name":"tack"
"f_text":"任意の文字"
"s_text":"任意の文字(上記と内容別)"
"t_text":"任意の文字(上記と内容更に別)"
"sound":"www_01"
"image":"yyy_01"

"target_id":"xxxx"
"name":" "
"f_text":"任意の文字"
"s_text":"任意の文字(上記と内容別)"
"t_text":"任意の文字(上記と内容更に別)"
"sound":"www_02"
"image":"yyy_02"


↓置換を行った状態


"image":"yyy_01"
"sound":"www_01"
"name":"tack"
"f_text":"任意の文字"
"s_text":"任意の文字(上記と内容別)"
"t_text":"任意の文字(上記と内容更に別)"

"image":"yyy_02"
"sound":"www_02"
"name":" "
"f_text":"任意の文字"
"s_text":"任意の文字(上記と内容別)"
"t_text":"任意の文字(上記と内容更に別)"


固定文字は左側の""で囲まれたものだけと考え、右側は内容が異なる場合に、右側の
情報を保持したまま上記のような行の位置を入れ替えたような置換を行いたいのです。
またファイルによっては上記のテキスト群の数が異なる場合もあります。


[ ]
RE:09796 特定文字を含む行に対する置換No.09797
こみやんま さん 22/03/28 23:51
 
並びが正しければ、
//---------------------------------------------------
setcompatiblemode 0x0F;

// 一撃でもとへと戻せるようにグループ
begingroupundo;

// 最後のデータに改行が入ってないと面倒なので1つは入れる
gofileend;
insertreturn;
gofiletop;

// 置き換え
replaceall "(\"target_id\":\".+?\")\\n(\"name\":\".+?\")\\n(\"f_text\":\".+?
\")\\n(\"s_text\":\".+?\")\\n(\"t_text\":\".+?\")\\n(\"sound\":\".+?\")\\n(\
"image\":\".+?\")" , "\\7\\n\\6\\n\\2\\n\\3\\n\\4\\n\\5\\n" , regular, nocas
esense, nohilight;

endgroupundo;
//---------------------------------------------------


とかのマクロで動作するのでないでしょうか。

ただし、普通ならばそこまでjsonに近いならば、もとデータはjsonフォーマットにし
ておいたほうがいいと思います。
(意味を持つデータ・フォーマットにしておけば、どのような順番にDisplayするな
どがかなり自由になるので)

[ ]
RE:09797 特定文字を含む行に対する置換No.09798
tack さん 22/03/29 00:50
 
ご返信ありがとうございます。

仰る通りjson形式の物(保存自体はtxt形式)ですが、固定文字の行間にも別のパラ
メータ文字があり、それらをマクロで削除+空白行になったものを削除してから、記
載いただいたマクロを(パラメータ箇所の名称を変更、保存し)登録の上、実行しま
したが上手く動作しないようです。
記載したパラメータ以外の行は全て削除してあるため、問題はないと思うのですが。
実際の内容を一部抜粋した物が下記になります。


"target_id":"2009"
"adv_name":" "
"fist_line_text":"部屋で、"
"second_line_text":"寝る時間だからと"
"third_line_text":"自分の部屋に戻ろうとすると――。"
"voice_id":""
"file_name":"advbg_005"
"target_id":"2009"
"adv_name":"虎"
"fist_line_text":"あのー…。"
"second_line_text":" 今夜は一緒に、寝ませんか?」"
"third_line_text":""
"voice_id":"2009_05_h_1"
"file_name":"advbg_005"
"target_id":"2009"
"adv_name":" "
"fist_line_text":"突然の申し出に少し驚く。"
"second_line_text":"僕は、"
"third_line_text":"少し考えた後、承諾する。"
"voice_id":""
"file_name":"advbg_006"

[ ]
RE:09798 特定文字を含む行に対する置換No.09799
こみやんま さん 22/03/29 01:58
 
最初の提示のパターンとは異なり、valueの部分が空のパターンがあるからかと。

//---------------------------------------------------
setcompatiblemode 0x0F;

// 一撃でもとへと戻せるようにグループ
begingroupundo;

// 最後のデータに改行が入ってないと面倒なので1つは入れる
gofileend;
insertreturn;
gofiletop;

// 置き換え
replaceall "(\"target_id\":\".*?\")\\n(\"adv_name\":\".*?\")\\n(\"fist_line_
text\":\".*?\")\\n(\"second_line_text\":\".*?\")\\n(\"third_line_text\":\".
*?\")\\n(\"voice_id\":\".*?\")\\n(\"file_name\":\".*?\")" , "\\7\\n\\6\\n\\2
\\n\\3\\n\\4\\n\\5\\n" , regular, nocasesense, nohilight;

endgroupundo;
//---------------------------------------------------

[ ]
RE:09799 特定文字を含む行に対する置換No.09800
こみやんま さん 22/03/29 03:08
 
ちなみに、もしも、以下のように本来はちゃんと「エラーのないjsonデータ」になっ
ているのであれば、
-------------------------------------------------------
{
    "root": [
        {
            "target_id": "2009",
            "adv_name": " ",
            "fist_line_text": "部屋で、",
            "second_line_text": "寝る時間だからと",
            "third_line_text": "自分の部屋に戻ろうとすると――。",
            "voice_id": "",
            "file_name": "advbg_005"
        },
        {
            "target_id": "2009",
            "adv_name": "虎",
            "fist_line_text": "あのー…。",
            "second_line_text": " 今夜は一緒に、寝ませんか?」",
            "third_line_text": "",
            "voice_id": "2009_05_h_1",
            "file_name": "advbg_005"
        },
        {
            "target_id": "2009",
            "adv_name": " ",
            "fist_line_text": "突然の申し出に少し驚く。",
            "second_line_text": "僕は、",
            "third_line_text": "少し考えた後、承諾する。",
            "voice_id": "",
            "file_name": "advbg_006"
        }
    ]
}
-------------------------------------------------------


https://秀丸マクロ.net/?page=nobu_tool_hm_javascript でも使って
-------------------------------------------------------
#JS = loaddll( hidemarudir + @"\hmJS.dll");

#_ = dllfuncw( #JS, "DoString", R"JS(

// 今開いているテキスト全体をtext変数へ
var text = hm.Edit.TotalText;

// jsonとしてパースする
var jsdata = JSON.parse(text);

// root キーが存在すれば
if (jsdata["root"]) {
    // root キーのデータの数を取得
    var len = jsdata["root"].length;

    // アウトプット枠に出力
    hm.OutputPane.Output("全部で" + len + "件のデータを処理予定\r\n");

    // 1回の処理ということにする(begin)
    hm.Macro.Statement("begingroupundo");

    // テキストエリアクリア
    hm.Edit.TotalText = "";

    // rootキーのvalueに相当するデータ配列の数ぶん...
    for(var i=0; i<len; i++) {

        // テキスト連結用
        var last_data_json = "";

        // 今のi番目のデータ
        var current = jsdata["root"][i];

        // 並び替えて連結する
        last_data_json += current_data_format(current, "file_name");
        last_data_json += current_data_format(current, "voice_id");
     // last_data_json += current_data_format(current, "target_id");
        last_data_json += current_data_format(current, "adv_name");
        last_data_json += current_data_format(current, "fist_line_text");
        last_data_json += current_data_format(current, "second_line_text");
        last_data_json += current_data_format(current, "third_line_text");
        last_data_json += "\n";

        hm.Macro.Statement("insert", last_data_json );
    }

    // 1回の処理ということにする(end)
    hm.Macro.Statement("endgroupundo");
}

// 1つのデータの出力の形
function current_data_format( current, key_name ) {
    return "\"" + key_name + "\":\"" + current[key_name] + "\"\n";
}
)JS");


freedll(#JS);
-------------------------------------------------------
みたいいにしたほうが良いかと。

というかぶっちゃけ、ただのjsonデータの表示の置き換えなので
秀丸は全く関係ないので、秀丸以外でやったほうが早いかと。

[ ]
RE:09800 特定文字を含む行に対する置換No.09804
tack さん 22/03/31 21:20
 
たしかにマクロが動作しました、ご連絡が遅くなってしまい申し訳ありません。
jsonファイルの整形が調べても良く分からなかったものでどうにか出来ないかと考え
てマクロを調べた次第でした。
jqによる整形もと思ったのですが、jqによる整形後も自分ではマクロにしか行きつか
なかったので、今回ご助言いただき大変ありがとうございます。

[ ]