問題部分を修正して、構造をシンプルにしました。
数値合計.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"
}