PowerShell
cobol

COBOLの行番号を振りなおすPowerShell

はじめに

若輩者ながらメインフレーマーCOBOLer社内SEとして働いていて、ソースコードはメインフレームとWindowsPC間をFTPしてPC環境のテキストエディタで編集しています(諸先輩方はメインフレームOS上のエディタを使っていますが、わたしには操作が独特すぎて普通のテキストエディタのほうが生産性高そうでしたので)

COBOLではソースコード各行の1~6カラム目にある行番号という6桁の数値(000100みたいな)が昇順で並んでいないと、コンパイル時にエラーとなってしまいます(コンパイラーのオプションによる)
PC環境の一般的なテキストエディタにはCOBOLの行番号を付加する機能などありませんので(お高級なCOBOLエディタなどはない)、PowerShellでスクリプトを作りました。

COBOLいじいじスクリプトなどQiitaでウケるわけないと思いますが、一応メモとして残しておきます。

仕様

  • COBOLソースの1~6カラム目に昇順となる連番を付加する
  • 既に書かれている行番号は無視して上書き
  • マルチバイト文字も考慮して1行80バイトに整える
  • 以下のようにsourceフォルダにあるCOBOLソースを整形してdestフォルダに出力する
    ├ source/
    │ ├ aaa.cbl
    │ └ bbb.cbl
    ├ dest/
    └ setLineNumber.ps1

スケッ2チ.png
↑を↓のようにする
スケッチ.png

ソースコード

ワンライナーとかは使わずゴリゴリと書いたコードです・・・

setLineNumber.ps1
#行番号を付加する関数
function Set-LineNumber([string]$lineStr,[int]$lineNumber) 
{ 
    #1行の文字列を配列に格納
    $lineAry = $lineStr.ToCharArray()
    #付加する行番号を配列に格納
    $lineNumberAry = $lineNumber.ToString("000000").ToCharArray()
    if($lineAry.Length -lt 6)
    {
        return $lineNumberAry -join ""
    }
    else
    {
        #行番号を付加or上書きする
        for($i = 0;$i -lt 6; ++$i)
        {
            $lineAry[$i] = $lineNumberAry[$i]
        }
        return $lineAry -join ""
    }
}

#文字列をバイト指定の長さに切りそろえる
function Get-SubStringBytes([String]$Text, [int]$StartIndex = 0, [int]$Length = 80) 
{ 
    $enc = [System.Text.Encoding]::Default  #Defaultは普通shift_jis
    $bytes = $enc.GetBytes($Text) 
    return $enc.GetString($bytes, $StartIndex, $Length) 
}


#行番号の開始の値
$beginNum = 10
#加算する値
$addNum = 10
#1行の長さ
$lineLength = 80


#スクリプト自身の親パスを取得
$Path = Split-Path -Parent $MyInvocation.MyCommand.Path

#sourceフォルダにあるファイルを取得
$cblList = Resolve-Path (Join-Path $Path "source\*.*")

foreach($cblFile in $cblList)
{
    $fileName =  Split-Path -Path $cblFile -Leaf
    $lineNumber = $beginNum
    $loopCnt = 1
    #ソースを1行ずつ読む
    foreach($line in Get-Content $cblFile)
    {
        #行番号付加
        $outline = Set-LineNumber $line $lineNumber

        #右に空白を入れて80文字に整える
        $outline = $outline.PadRight($lineLength)

        #全角文字を考慮して80バイトに切りそろえる
        $outline = Get-SubStringBytes $outline, 0, $lineLength

        #destフォルダへ出力
        $writePath = Join-Path (Join-Path $Path "dest") $fileName
        if ($loopCnt -eq 1)
        {
            Set-Content $writePath $outline 
        }
        else
        {
            Add-Content $writePath $outline
        }

        $lineNumber += $addNum
        $loopCnt++
    }
}

echo "終了!"

参考元