元csv形式ファイルの編集についてNo.09978
tack さん 22/11/06 23:49
 
いつもお世話になっております。


title,address,sub_address,move,no,info,se,label,char1,char2,char3,char4,char
5,char6,char7,char8,message,mark
トップページ,GL007TTWOR,0_0_0,1,F001,021,E002,リンゴ_500EM1,500TM1_2_6_1_3_0,
1,5_1,,,,,,ここはトップページです。,3
トップページ,GL007TTWOR,0_0_0,1,F002,022,E006,リンゴ_500EM1,500TM1_2_5_2_3_0,
5,1_2,,,,,,リンゴを購入しますか?,3
トップページ,GL042XCYLI,0_0_0,1,,022,,,500TM1_2_5_2_3_2,,,,,,,,トップページ
から移動しますか?,3
トップページ,GL042XCYLI,0_0_0,2,,022,,,500TM1_2_5_2_3_2,,,,,,,,リンゴを購入
しました。,3

上記のような、カンマ区切りのテキストがあり(元々はcsvファイルの一部です)、
これをマクロで必要箇所のみ抽出して、抽出後並べ替えを行いたいと考えています。
(labelなど一部null、またchar4のように全てnullのデータ箇所があるものとなりま
す。)



// CSVデータの特定列のみを取得する

// 取得する列数を指定 1列目は: 0、2列目: 1 ...
#COL_NUM1 = 1;

// すべてを選択する
selectall;

// 選択範囲の文字列を取得する
$address = gettext(seltopx,seltopy,selendx,selendy);

// 分割
#num1 = split($arr_address, $address, "\r\n");

#a = 0;
while(#b <= #num1){
 
 // 行データをタブで分割
 #num_col1 = split($arr_col1, $arr_address[#a], ",");
 
 // 列データを取得
 $s1 = $arr_col1[#COL_NUM1];
 
 // 行いたい処理を記述
 message $s1;
 
 #a = #a + 1;
}




こういった形で指定行1つ(上記のaddress)のデータは表示できたのですが、複数
行を指定かつその指定した行のデータを並べ替える場合、指定した複数行の各データ
を配列に格納してデータ個数分書き込むという手順になると考えています。
このようなデータ形式で記載されているものに対し、複数行のデータを指定して取得
できるものでしょうか?
同じ内容のマクロ内容を
配列に格納する場合、どこでデータ個数を取得すべきでしょうか?

アウトプットの形は
・info
●address
〇move
◎no
label,message
と考えています。

また info、address、moveのみ、データ内容が途中で変わるまで、内容を省略したい
場合は並べ替え後に別マクロで行う方が分かりやすいでしょうか?
(下記が例となります。)

・021
●GL007TTWOR
〇1
◎F001
リンゴ_500EM1,ここはトップページです。
・022


◎F001
リンゴ_500EM1,リンゴを購入しますか?

●GL042XCYLI

◎F001
,トップページから移動しますか?


〇2
◎F001
,リンゴを購入しました。

[ ]
RE:09978 元csv形式ファイルの編集についNo.09981
秀丸担当 さん 22/11/07 17:43
 
マクロの目的が把握できていないとしたらすみません。
複数行のデータを取り込むには、配列に$a[0]=... $a[1]=...といったように格納し
ていくことが考えれますが、配列を入れ替えるソート処理を作るとすると面倒なこと
になってくると思います。
改行を含めた1つだけの変数に追加していって、それをソートしたほうがやりやすい
です。

ソートするには、通常の操作では、[編集]→[変換]→[ソート...]でできますが、こ
のオプションはCSVを想定した列を選択したソートができます。
[TSV/CSV]をONにして、[CSV(カンマ区切り)]で、addressのところは[カラム指定]で2
にします。
または、[表示]→[タブストップ]→[CSVモード]にしておくと、ルーラー位置を右ク
リックして列単位のソートも選べます。

これをマクロにするには、filter文またはfilter関数の変換モジュールの"Sort"にな
ります。
マクロヘルプのfilter文のところに、キー操作の記録を使ったパラメータの作成方法
があります。
2番目の列のソートを記録したら、以下のようになりました。
filter "" , "Sort" , "010000110001001\"10011";

これは関数にも適用できます。
$a = filter( "" , "Sort" , "010000110001001\"10011", $a);

以下のように、抽出したい行を改行付きで1つの文字列に追加していくと、filter関
数でソートができます。
$a="";
$a=$a+"xxx,yyy,zzz\n";
$a=$a+"aaa,bbb,ccc\n";
$a = filter( "" , "Sort" , "010000110001001\"10011", $a);

ソートした後、各行について処理していくといいと思います。

filterではできない独自のソートのルールがあるとしたら、配列でどうにかしたほう
がいいかもしれないです。V9.19のJavaScriptを使った方法だと配列を使ったソート
とかもしやすいかもしれません。

[ ]
RE:09978 元csv形式ファイルの編集についNo.09982
igus さん 22/11/07 22:33
 
Tackさん、こんにちは。
rubyを使ってよければこんな感じでどうでしょう。


//csv編集.mac

runsync2 "rubyw -x "+currentmacrofilename+" "+filename;
openfile "tmp.txt";
endmacro;

/*
#/
#! ruby

# encoding: utf-8
Encoding.default_external = 'UTF-8'

$stdout=open("tmp.txt","w")
$stderr=open("err.txt","w")

file=ARGV[0]
ar=open(file).readlines.map{|e| e.split(",")}.map{|e|
  puts "・"+e[5]+"\n●"+e[1]+"\n〇"+e[3]+"\n◎"+e[4]+"\n"+e[7]+","+e[16]}
__END__
*/


[ ]
RE:09982 元csv形式ファイルの編集についNo.09984
tack さん 22/11/09 01:16
 
igus様こんばんわ。
rubyを知らないため、考えが思いつきませんでした。
下記のお教えいただいたマクロについて単純に実行したのみだと、tmp.txtを開く 
で完了しましたので、恐縮ではありますがマクロの内容についてお教えいただければ
と思います。


runsync2 "rubyw -x "+currentmacrofilename+" "+filename;
 →秀丸からrubyを起動
openfile "tmp.txt";
 →tmp.txtを開く
endmacro;

/*
 →秀丸マクロの文字列の始まり?
#/
 →ここが分かりません。

#! ruby
 →rubyを起動

# encoding: utf-8
Encoding.default_external = 'UTF-8'
 →#行はコメントアウト、UTF-8でエンコードする

$stdout=open("tmp.txt","w")
$stderr=open("err.txt","w")
 →標準出力ファイルをtmp.txt、エラー時出力をerr.txtとして書き込む

file=ARGV[0]
ar=open(file).readlines.map{|e| e.split(",")}.map{|e|
  puts "・"+e[5]+"\n●"+e[1]+"\n〇"+e[3]+"\n◎"+e[4]+"\n"+e[7]+","+e[16]}
__END__
 →ENDより上が配列等のマクロ主要分、ENDは以下をrubyで読み込ませない終わりの
指定。

*/
 →秀丸マクロの文字列の終わり?


[ ]
RE:09984 元csv形式ファイルの編集についNo.09986
igus さん 22/11/09 08:17
 
tackさん、こんにちは。
rubyを使った外部変形になってるのでrubyをインストールしてからご利用下さい。

https://rubyinstaller.org/downloads/
から
Ruby+Devkit 3.1.2-1 (x64)  (64ビット)
Ruby+Devkit 3.1.2-1 (x86) (32ビット)
をダウンロードしてインストールすることができます。

スクリプトの内容は概ね正解ですが、ちょっと追記してみます

runsync2 "rubyw -x "+currentmacrofilename+" "+filename;
 →秀丸からrubyを起動○
openfile "tmp.txt";
 →tmp.txtを開く○
endmacro;

/*
 →秀丸マクロの文字列の始まり?→秀丸マクロコメント開始
#/
 →ここが分かりません。→rubyのハイライト調整(コメント)

#! ruby
 →rubyを起動→rubyのスクリプト開始

# encoding: utf-8
Encoding.default_external = 'UTF-8'
 →#行はコメントアウト、UTF-8でエンコードする○

$stdout=open("tmp.txt","w")
$stderr=open("err.txt","w")
 →標準出力ファイルをtmp.txt、エラー時出力をerr.txtとして書き込む○

file=ARGV[0]
ar=open(file).readlines.map{|e| e.split(",")}.map{|e|
  puts "・"+e[5]+"\n●"+e[1]+"\n〇"+e[3]+"\n◎"+e[4]+"\n"+e[7]+","+e[16]}
__END__
 →ENDより上が配列等のマクロ主要分、ENDは以下をrubyで読み込ませない終わりの
指定。○

*/
 →秀丸マクロの文字列の終わり?→秀丸マクロコメント終了

[ ]
RE:09986 元csv形式ファイルの編集についNo.09989
igus さん 22/11/09 14:12
 
一応、rubyを使わないマクロも書いてみました。

//csv編集.mac

selectall;
$sel=gettext(seltopx,seltopy,selendx,selendy);
#lineno=split($ln,$sel,"\r\n");

#i=0;$s1="";
while(#i < #lineno-1){
  #column=split($cl,$ln[#i],",");
  $s1=$s1+"・"+$cl[5]+"\n●"+$cl[1]+"\n〇"+$cl[3]+"\n◎"+$cl[4]+"\n"+$cl[7]+
","+$cl[16]+"\n";
  #i=#i+1;
}
openfile "";
insert $s1;


[ ]
RE:09989 元csv形式ファイルの編集についNo.09993
tack さん 22/11/09 22:45
 
igus様こんばんわ。
rubyをインストール後行った結果、記号が文字化けを起こしてしまったため少し改良
を考えてみます。
またrubyを使わないマクロが希望通りの動作を実行してくれました。

スクリプトの内容についてもご回答いただき大変助かりました。
今回のrubyを使わなかったマクロをまた読み解いてみたいと思います。
本当にありがとうございます!

[ ]