の記事に対するCPU.BACHさんのコメントに関して・・・
「LIBSX」という「OrCAD」の部品ライブラリソースファイルを、
水魚堂さんの回路図エディタ「CE」の部品ライブラリに変換
するツールがあります。
これ、MS-DOS時代のツールでして「MS-C」で作ったんです
が、これを手直しして「BSch3V」用の部品ライブラリ「LB3」
変換ツールに出来ないものかと、ちょいと試行錯誤してみ
ました。
で、ツールですがCでコンパイルするんじゃなく、「gawk」を
使ってみました。
※MS-DOS時代からjgawkはあれこれと使っています。
そこで、OrCAD部品ソースに出てくる文字列処理での
「正規表現」につまずいちゃいました。
部品ソース内にこんな行が出てきます。
'7400' ←部品名
{X Size =} 4 {Y Size =} 4 {Parts per Package =} 4 ★
L1 1 4 9 12 IN 'I0' ←ピン指定
L3 2 5 10 13 IN 'I1'
R2 3 6 8 11 DOT OUT 'O'
T0 14 14 14 14 PWR 'VCC'
B0 7 7 7 7 PWR 'GND'
★部分で部品の大きさとパッケージ内の個数を
示しています。
前処理としてコメント文字列である「 {xxx} 」を消して、
数字「4 4 4」だけを残したいのですが、この↓正規表現
ではうまくいきません。
gsub(/{.*}/, "", $0)
{ }に囲まれた文字列という正規表現なのですが、
{xxx} yyy {xxx} zz が
1 2 3 4
残したいyyyまで消えて、最後尾のzzしか残らない
のです。
「/{.*}/」だと、{ }のくくりを、2と3を飛ばして「1~4」にし
ちゃっています。
ほんとは、1~2で処理。続いて3~4で処理と{ }を含
めて{ }内の文字列を消して欲しいのです。
しかたなく、↓のようなスクリプトでもって{ }を消して
います。
1文字ごと読み出して { 出現でコピーをオフ、} 検出以降
にコピー再開。
※こりゃawkのスクリプトじゃないぞ(笑)
##### コメントを取り除く #####
# 読み出したデータの中から「コメントフィールド」を取り除く
# OrCADのライブラリソースのコメントは「{...}」となっている
# 直接バッファを操作して「{}」とコメントを取ってしまう
# gsub(/{.*}/, "", $0)だと
# 「{xxx} yyy {xxx} zz」が yyyまで消えてzzしか残らない
function rmvcmnt(s, c,f)
{
r_bff = "";
f = 0; # 1で文字コピー禁止
for(i = 1; i <= length(s); i++){
c = substr(s, i, 1); # 1文字取り出し
if(c == "{") f = 1; # 「{」以降はコピーしない
else if(c == "}") f = 0; # コピー再開
else if(f == 0){ # 文字連結
r_bff = r_bff c; # {xxx}以外の文字はコピー
}
}
return r_bff; # コメント削除した1行
}
正規表現を使っての何か良い手順はありませんかね?
※参考
ファイルから読み出した1行は「$0」に入る。
function rmvcmnt(s, c,f)の s は関数への引数。
その次にスペースをあけてのc,fは関数内部だけの局所変数。
ほかにも、「 { } 」で囲まれたこんなコメントがあります。
{000000000011111111112}
{.....................}
{012345678901234567890}
{ 0.0}##...................
{ 0.1}#.##.................
{ 0.2}#...##...............
{ 0.3}#.....##.............
{ 0.4}#.......##...........
{ 0.5}#.........##.........
{ 0.6}#...........##.......
{ 0.7}#.............##.....
{ 0.8}#...............##...
{ 0.9}#.................##.
{ 1.0}#...................#
{ 1.1}#.................##.
{ 1.2}#...............##...
{ 1.3}#.............##.....
{ 1.4}#...........##.......
{ 1.5}#.........##.........
{ 1.6}#.......##...........
{ 1.7}#.....##.............
{ 1.8}#...##...............
{ 1.9}#.##.................
{ 2.0}##...................
これも行の中から消してしまいたいわけでして。
{X Size =} 、 {Y Size =}、{Parts per Package =}は
固定文字列なんで3つを個別にgsubで先に処理。
その後、「{ 2.0}」などを正規表現で削除かな。
こんな具合に。
# コメント文 {xxx} を消す
gsub("{X Size =}", "", $0); # コメント削除
gsub("{Y Size =}", "", $0);
gsub("{Parts per Package =}", "", $0);
gsub(/{.*}/, "", $0); # 残りの{...}を全部
:
最近のコメント