[ 新規に投稿する ]

元csv形式ファイルの編集についてNo.09978
tack さん 22/11/06 23:49 [ コメントを投稿する ]
  いつもお世話になっております。


title,address,sub_address,move,no,info,se,label,char1,char2,char3,char4,char5,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を使わなかったマクロをまた読み解いてみたいと思います。
本当にありがとうございます!
[ ]

[ 新規に投稿する ]