Jw_cad 相談室−その2 New

 Jw_cad についての相談の場としてお使いください
情報の交換には Jw_cad 情報交換室 をご利用ください
なお、情報交換室と相談室の両方に同じ内容を投稿するのはご遠慮ください

2009年9月以前の発言過去ログのページからご覧ください。

それ以降の過去ログは消失しています。
申し訳ありませんが、復活の予定はありません。


新規投稿 ┃ツリー表示 ┃スレッド表示 ┃一覧表示 ┃トピック表示 ┃番号順表示 ┃検索 ┃設定 ┃過去ログ ┃ホーム
1 / 391 ツリー    前へ→

外変の修正(範囲内合計) momochi 25/8/10(日) 17:09
Re:外変の修正(範囲内合計) momochi 25/8/13(水) 17:23
Re:外変の修正(範囲内合計) いっち 26/1/20(火) 8:09
Re:外変の修正(範囲内合計) momochi 26/1/21(水) 10:21
Re:外変の修正(範囲内合計) いっち 26/1/21(水) 12:23
Re:外変の修正(範囲内合計) いっち 26/1/21(水) 21:36

外変の修正(範囲内合計)
 momochi  - 25/8/10(日) 17:09 -
表計算の範囲内合計と同様の外変を(ChatGPTで)作成しましたが、
出力される合計値の末尾に「"」が付いてしまい、削除できません。
例:500" → 500 にしたいです。
どのように修正すればよいかご教示ください。

数値合計.bat

@echo off
REM Jw_cad 外変:数値合計(AWK最小・画面中心フォールバック付き)
REM #jww
REM #cd
REM #h3
REM #hc 合計したい文字(ch)を範囲選択してください
REM #0 書込み位置をクリック
REM #e

gawk -f "数値合計.awk" jwc_temp.txt > temp.txt
if exist jwc_temp.txt del jwc_temp.txt
rename temp.txt jwc_temp.txt


数値合計.awk

# 数値合計.awk(外変1・原点リセット最小版)? 0°固定・末尾に「"」が付かない(全文)
# 目的: cs/# の数値も合算し、通常文字(ch)で合計を出力。角度は常に 0°。
# 本文は数値のみ。本文中の余分なクォートは除去。

BEGIN{
SUM=0; CX=CY=""; FH="";
DXR=0.00; DYR=0.00; ABS_DX=0; ABS_DY=0; # 既存のまま(位置計算は /10)
}

function z2h(s, i,c,from,to){
from="0123456789.−+,"; to="0123456789.-+,";
for(i=1;i<=length(from);i++){ c=substr(from,i,1); gsub(c, substr(to,i,1), s) }
gsub(/,/, "", s);
return s;
}

function add_nums(t, s,m){
s=z2h(t);
while (match(s,/[-+]?[0-9]+(\.[0-9]+)?/)){
m=substr(s,RSTART,RLENGTH)+0;
SUM+=m;
s=substr(s,RSTART+RLENGTH);
}
}

function trim_zeros(s){
gsub(/\.?0+$/,"",s);
return (s=="" ? "0" : s);
}

function sanitize_text(s){
# 本文中に混入したクォート類を除去(表示末尾に " が出ないようにする)
gsub(/["”“〃″????W]/, "", s);
return s;
}

# クリック座標 (先頭 0 行)
/^[ \t]*0[ \t]+/{
n=split($0,a,/[ \t]+/);
if(n>=3){ CX=a[2]; CY=a[3]; }
}

# ch 行: 高さ FH を取得、本文の数値を加算(角度は読まない)
/^[ \t]*ch[ \t]+/{
if(FH==""){
n=split($0,a,/[ \t]+/);
if(n>=4) FH=a[4];
}
q=index($0,"\"");
if(q>0) add_nums(substr($0,q+1));
}

# cs 行(" あり/なし 両対応)
/^[ \t]*cs[ \t]+/{
q=index($0,"\"");
if(q>0){
add_nums(substr($0,q+1));
} else if ($NF ~ /^[-+]?[0-9]+(\.[0-9]+)?$/){
add_nums($NF);
}
}

# ベクトル文字の本文が "# " の場合
/^# /{
if(length($0)>=3) add_nums(substr($0,3));
}

END{
# フォールバック
if(CX=="" || CY==""){ CX=100; CY=100; }
if(FH=="") FH=600;

# 合計の本文(数値のみ)→ クォート類を除去
sumstr = trim_zeros(sprintf("%.6f", SUM+0));
if(sumstr=="") sumstr="0";
sumstr = sanitize_text(sumstr);

# 配置(/10)
px = CX / 10 + ABS_DX;
py = CY / 10 + ABS_DY;

# 出力:角度は常に 0° 固定。※ "%s" は必ず閉じクォート付き(\"%s\"\n)
print "bz";
printf("ch %.6f %.6f %.0f 0 \"%s\"\n", px, py, FH, sumstr);
}

引用なし

パスワード


<Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36@p6382019-ipoe.ipoe.ocn.ne.jp>
・ツリー全体表示

Re:外変の修正(範囲内合計)
 momochi  - 25/8/13(水) 17:23 -
問題部分を修正して、構造をシンプルにしました。


数値合計.bat

@echo off
REM Jw_cad 外変:選択した数値の合計をクリック位置に表示
REM #jww
REM #cd
REM #h3
REM #hc 合計したい文字(ch)を範囲選択してください
REM #0 書込み位置をクリック
REM #e
gawk -f "数値合計.awk" jwc_temp.txt > temp.txt
if errorlevel 1 exit /b 1
if exist temp.txt (
if exist jwc_temp.txt del jwc_temp.txt
rename temp.txt jwc_temp.txt
)


数値合計.awk

BEGIN {
SUM=0; CX=""; CY=""; FH=""; pi=atan2(0,-1)
print "h# 数値合計処理開始" > "/dev/stderr"
}
# 全角→半角変換+クォート除去
function clean_num(s) {
from="0123456789.−+"; to="0123456789.-+"
for(i=1; i<=length(from); i++) gsub(substr(from,i,1), substr(to,i,1), s)
gsub(/["”“〃″W]/, "", s) # クォート除去
return s
}
# 数値抽出&加算
function add_nums(s) {
s = clean_num(s)
while (match(s, /[-+]?[0-9]+(\.[0-9]+)?/)) {
num = substr(s, RSTART, RLENGTH) + 0
SUM += num
s = substr(s, RSTART+RLENGTH)
print "h# 数値加算: " num ", 合計: " SUM > "/dev/stderr"
}
}
# 小数点以下の不要な0を除去
function trim_zeros(s) {
gsub(/\.?0+$/, "", s)
return (s == "" ? "0" : s)
}
# クリック座標 (0 行)
/^[ \t]*0[ \t]+/ {
n = split($0, a, /[ \t]+/)
if (n >= 3) {
CX = a[2]; CY = a[3]
print "h# 0行からクリック座標取得: CX=" CX ", CY=" CY > "/dev/stderr"
}
}
# クリック座標 (hp0 行、参考スクリプト対応)
/^[ \t]*hp0[ \t]+/ {
n = split($0, a, /[ \t]+/)
if (n >= 3) {
CX = a[2]; CY = a[3]
print "h# hp0行からクリック座標取得: CX=" CX ", CY=" CY > "/dev/stderr"
}
}
# ch 行: 高さ FH を取得、数値加算
/^[ \t]*ch[ \t]+/ {
if (FH == "") {
n = split($0, a, /[ \t]+/)
if (n >= 4) FH = a[4]
}
q = index($0, "\"")
if (q > 0) add_nums(substr($0, q+1))
}
# cs 行: クォートあり/なし両対応
/^[ \t]*cs[ \t]+/ {
q = index($0, "\"")
if (q > 0) {
add_nums(substr($0, q+1))
} else if ($NF ~ /^[-+]?[0-9]+(\.[0-9]+)?$/) {
add_nums($NF)
}
}
# ベクトル文字 (# )
/^# / {
if (length($0) >= 3) add_nums(substr($0, 3))
}
# 入力データのログ
{
print "h# 入力行: " $0 > "/dev/stderr"
}
END {
# フォールバック
if (CX == "" || CY == "") {
CX = 0; CY = 0
print "h# フォールバック座標使用: CX=" CX ", CY=" CY > "/dev/stderr"
}
if (FH == "") FH = 600
# 合計値(小数点以下0除去)
sumstr = trim_zeros(sprintf("%.6f", SUM))
if (sumstr == "") sumstr = "0"
# 出力: 角度0°固定、cs形式、クリック位置に直接配置
print "bz"
printf("z3\ncs %.15g %.15g 1 0 \"%s\n", CX, CY, sumstr)
print "h# 合計値 " sumstr " を座標 (" CX ", " CY ") に配置" > "/dev/stderr"
}

引用なし

パスワード


<Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36@p6382019-ipoe.ipoe.ocn.ne.jp>
・ツリー全体表示

Re:外変の修正(範囲内合計)
 いっち  - 26/1/20(火) 8:09 -
▼momochiさん:

現在の数値合計は、

1,001
1,010
1,100

を合計すると、

1 + 1+ 1 + 10 + 1+ 100 で 114
になると思います。
,を普通の文字として扱うからです。

スクリプトを(少し)改変すれば、

1001 + 1010 + 1100 で 3,111
とすることも出来ます。

私が行った改変例は記載致しませんが、awk の練習には手ごろなサンプルだと思います。

--------------------------------------------------

awk で 3桁カンマを付ける方法は、google の検索で、ヒントが出てきます。
私の場合は、下記の2つの awk で動作するものを基に調整して組み込みました。

1)gawk-5.3.2-w32-bin.zip
2)goawk_v1.31.0_windows_386.zip

※goawkは、utf8用です。

引用なし

パスワード


<Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36@KD059129054212.ppp-bb.dion.ne.jp>
・ツリー全体表示

Re:外変の修正(範囲内合計)
 momochi  - 26/1/21(水) 10:21 -
▼いっちさん:
こちらの環境では、「半角数値+半角カンマ」、「全角数値+半角カンマ」の合計は可能になりましたが、「全角数値+全角カンマ」の合計はできませんでした。

引用なし

パスワード


<Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36@p6382019-ipoe.ipoe.ocn.ne.jp>
・ツリー全体表示

Re:外変の修正(範囲内合計)
 いっち  - 26/1/21(水) 12:23 -
▼momochiさん:
>▼いっちさん:
>こちらの環境では、「半角数値+半角カンマ」、「全角数値+半角カンマ」の合計は可能になりましたが、「全角数値+全角カンマ」の合計はできませんでした。

momochiさんは、25/8/10(日) 17:09 の投稿の後、25/8/13(水) 17:23 の投稿で、自力で解決されているので、momochiさんなら簡単に解決出来るはずだと思い、投稿しました。

この外部変形は、文字列の中に含まれた数値を合計するのが目的で、文字列を残す訳ではない為、計算上不要になる「,」と「,」を、gsub で削除してしまえば良いだけです。

既に、
gsub(/["”“〃″W]/, "", s) # クォート除去
の gsub が書かれているので、そこに「,」(半角カンマ)と「,」(全角カンマ)を追加するだけで、出来ると思います。

今一度、何度か確認してみましたが、問題ありませんでした。

引用なし

パスワード


<Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36@KD059129054212.ppp-bb.dion.ne.jp>
・ツリー全体表示

Re:外変の修正(範囲内合計)
 いっち  - 26/1/21(水) 21:36 -
▼momochiさん:

>こちらの環境では、

の言葉が気になって、下記の確認を行いました。
但し、確認を行ったのは、私が改変して仕上げた状態のものでの話です。

私の環境では、下記でした。

1.gawk3.1.5 問題なし(Vectorからダウンロード出来ます。)

2.gawk3.1.6 問題なし(現在入手するのは、難しいです。)
3.gawk3.1.7 問題なし(現在入手するのは、難しいです。)
──────────────────────────

4.gawkm115.zip の gawk を jgawk にリネームしたもの
  
  これはダメでした。
  ちょっと、唖然としました。
  
──────────────────────────

ですから、今回用には、Vectorから、gawk 3.1.5 for Windows をダウンロードすると良いかもしれません。

引用なし

パスワード


<Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36@KD059129054212.ppp-bb.dion.ne.jp>
・ツリー全体表示

1 / 391 ツリー    前へ→
新規投稿 ┃ツリー表示 ┃スレッド表示 ┃一覧表示 ┃トピック表示 ┃番号順表示 ┃検索 ┃設定 ┃過去ログ ┃ホーム
 1268731
ページ:  ┃  記事番号:  

C-BOARD Moyuku v1.03b5
Jw_cad Copyright (C)1997-2021 Jiro Shimizu & Yoshifumi Tanaka