skutilitiesでyamlを操作

acount:
-
x: 0
y: 0
z: 0
world: world
-
x: 3.5
y: 31.5
z: 4.5
world: w-lobby
-
x: 3.5
y: 31.5
z: 4.5
world: w-lobby
acount:
-
x: 0
y: 0
z: 0
world: world
-
x: 3.5
y: 31.5
z: 4.5
world: w-lobby
-
x: 3.5
y: 31.5
z: 4.5
world: w-lobby
上記のように入れ子になった辞書をskUtilitiesで取得する方法が知りたいです… やってみたこと: なし(何をどうすればよいかわからなかったため)
16 Replies
yukkina
yukkina2y ago
skyamlみたいなやつ無かったっけぇ (無視していいよ)
月猫ch
月猫chOP2y ago
sk-yamlあったんですけど 構文がskutilitiesそっくりなうえに こっちのほうが見やすかったのでskutilitiesつこてます (何よりファイル操作が付いてるので…
yukkina
yukkina2y ago
そっくりなんだ 知らんかったわ 私もutilities大好き。
何か
何か2y ago
配列のハッシュは取れないみたいなので 違う形式で保存するようにしましょう
月猫ch
月猫chOP2y ago
っす…
何か
何か2y ago
自分でハッシュの配列を読み取れるようにするのもいいかもしれない
Unknown User
Unknown User2y ago
Message Not Public
Sign In & Join Server To View
月猫ch
月猫chOP2y ago
マジですか 具体的には、x y zをそれぞれ保持するデータをリスト状に管理したいんですよ classオブジェクトみたいに
Unknown User
Unknown User2y ago
Message Not Public
Sign In & Join Server To View
月猫ch
月猫chOP2y ago
とりあえず value1: x: 0 y: 0 z: 0 value2: x: 0 y: 0 z: 0 ってしてます…w
loop 1000 times:
if "value%loop-number%" がない:
exit 2 sections
else:
処理〜
loop 1000 times:
if "value%loop-number%" がない:
exit 2 sections
else:
処理〜
みたいな感じで すみません追加質問です。
testA:
tes: 0
testAA:
tes: 0
testBCD:
tes: 0
testA:
tes: 0
testAA:
tes: 0
testBCD:
tes: 0
以下のようなyamlで、testA, testAA, testBCDのリストを取得する方法ってありますか?
何か
何か2y ago
多分ない
command /test:
trigger:
read_yml("plugins/Skript/test.yml")
dump_list("test")

function dump_list(var: string):
loop indexes of {%{_var}%::*}:
if {%{_var}%::%loop-value%} is set:
broadcast "%{_var}%::%loop-value% -> %{%{_var}%::%loop-value%}%"
dump_list("%{_var}%::%loop-value%")

function read_yml(path: string, var: string = ""):
replace "\" with "/" in {_path}
set {_file} to substring of {_path} from (last index of "/" in {_path} + 1) to (last index of "." in {_path} - 1)

if length of {_var} > 0:
set {_file} to {_var}

delete {%{_file}%::*}

set {_c::*} to file contents of {_path}
loop {_c::*}:
set {_line} to loop-value
replace " " with " " in {_line}

set {_s::*} to {_line} split at ""
set {_space} to 0
loop {_s::*}:
if loop-value-2 is " ":
add 1 to {_space}
else:
stop loop
set {_text} to substring of {_line} from {_space} + 1 to length of {_line}

if {_text} is not set:
continue

if {_prev_s} > {_space}:
delete {_keys::%{_space}%}
set {_path} to ""
loop {_keys::*}:
set {_path} to "%{_path}%::%loop-value-2%"

set {_index} to index of ":" in {_text}

if {_index} > 0:
delete {_value}
set {_key} to substring of {_text} from 0 to {_index} - 1
set {_value} to substring of {_text} from {_index} + 2 to length of {_text}
if {_value} is not set:
set {_keys::%{_space}%} to {_key}

else:
evaluate "set {%{_file}%%{_path}%::%{_key}%} to %{_value}%"

else:
if {_text} is "-":
set {_keys::%{_space}%} to size of indexes of {%{_file}%%{_path}%::*}

set {_prev_s} to {_space}
command /test:
trigger:
read_yml("plugins/Skript/test.yml")
dump_list("test")

function dump_list(var: string):
loop indexes of {%{_var}%::*}:
if {%{_var}%::%loop-value%} is set:
broadcast "%{_var}%::%loop-value% -> %{%{_var}%::%loop-value%}%"
dump_list("%{_var}%::%loop-value%")

function read_yml(path: string, var: string = ""):
replace "\" with "/" in {_path}
set {_file} to substring of {_path} from (last index of "/" in {_path} + 1) to (last index of "." in {_path} - 1)

if length of {_var} > 0:
set {_file} to {_var}

delete {%{_file}%::*}

set {_c::*} to file contents of {_path}
loop {_c::*}:
set {_line} to loop-value
replace " " with " " in {_line}

set {_s::*} to {_line} split at ""
set {_space} to 0
loop {_s::*}:
if loop-value-2 is " ":
add 1 to {_space}
else:
stop loop
set {_text} to substring of {_line} from {_space} + 1 to length of {_line}

if {_text} is not set:
continue

if {_prev_s} > {_space}:
delete {_keys::%{_space}%}
set {_path} to ""
loop {_keys::*}:
set {_path} to "%{_path}%::%loop-value-2%"

set {_index} to index of ":" in {_text}

if {_index} > 0:
delete {_value}
set {_key} to substring of {_text} from 0 to {_index} - 1
set {_value} to substring of {_text} from {_index} + 2 to length of {_text}
if {_value} is not set:
set {_keys::%{_space}%} to {_key}

else:
evaluate "set {%{_file}%%{_path}%::%{_key}%} to %{_value}%"

else:
if {_text} is "-":
set {_keys::%{_space}%} to size of indexes of {%{_file}%%{_path}%::*}

set {_prev_s} to {_space}
a: 1
b: 2
c: 3

locations:
-
pos: location(200, 300, 400, world "world")
title: "草原"
weapons:
-
1: diamond sword named "最弱の剣"
2: stick
a: 1
b: 2
c: 3

locations:
-
pos: location(200, 300, 400, world "world")
title: "草原"
weapons:
-
1: diamond sword named "最弱の剣"
2: stick
何か
何か2y ago
何か
何か2y ago
もう自分でymlの処理を作ってしまったほうが使い勝手もいいし早い evaluateと組み合わせればskriptの表現も使えるのでこっちのほうがまし
月猫ch
月猫chOP2y ago
えー結論として ファイルをテキストとして取得し #やスペース タブから始まらない行を全部取得して リスト化することで実現しました(脳筋
何か
何か2y ago
上の関数使えば前に言ってた配列の中にハッシュ入れる奴もできるよ locationとして保存できるしもうxyz worldなんてする必要すらないけどね
月猫ch
月猫chOP2y ago
ですね、現状のままだと応用も聞かないので eggeさんのやつ参考にもうちょっといじってみます

Did you find this page helpful?