20文字ごとに改行して、行数と文字数を数え上げる ruby スクリプト。

#!/usr/local/bin/ruby
# txt ファイルを読み取り、KetaSuu 文字ごとに改行を行い、
# 最後に字数や行数や段落数などの情報をつけたして出力するスクリプト。
#
# いわゆる全角文字・半角文字も、すべて一文字と数える。
# 手元に高機能なワープロソフトなどがない場合に、
# 原稿用紙換算で、何文字くらいかを数え上げたい場合に。
#
# 将来的には禁則処理などをつけくわえると良いと思う。
# たとえば、20文字ごとに切り分けた結果、
# 21文字目に "、" や "。" や "」" が来た場合には、
# その "、" や "。" や "」" の文字を出力したあとで改行するなど。

$KCODE = 'u';
require 'jcode'


KetaSuu = 20
lineNumber = 0
charctersNumber = 0
paragraphNumber = 1
isZenkakuHankakuConvert = true

while (line = ARGF.gets)

        # 段落分けのための空行は、行数にカウントしない。
        if ( line != "\n")
                lineNumber += 1
        else
                paragraphNumber += 1
        end

        # もし isZenkakuHankakuConvert が true なら、
        # 半角の英数字や記号を全角に変換する。
        if ( isZenkakuHankakuConvert)
                line = line.tr('0-9', '0-9')
                line = line.tr('a-z', 'a-z')
                line = line.tr('A-Z', 'A-Z')
                line = line.tr('(-)', '(-)')
                line = line.tr('[-]', '[-]')
                line = line.tr('?', '')
                line = line.tr('!', '')
                line = line.tr('.', '')
                line = line.tr(',', '')
                line = line.tr('-', '')
                line = line.tr('+', '')
                line = line.tr('=', '')
        end


        # 文字列 line の文字数が KetaSuu よりも多いのであれば
        # KetaSuu 文字ごとに出力しては改行することを繰り返す。
        while ( KetaSuu + 1 < line.split(//u).size) do
                print line.split(//u)[0, KetaSuu] ,  "\n"

                line = line.split(//u)[KetaSuu, line.split(//u).size].join
                lineNumber += 1
        end
        print line

        charctersNumber = (lineNumber - 1) * KetaSuu + line.split(//u).size
end

print "1行", KetaSuu, "",  "", lineNumber, ""

# 最後の eof を字数からマイナスするために -1 
print "", charctersNumber - 1, "文字\n"

print "", paragraphNumber, "段落\n"