RubyScriptTemplate
目的
スクリプトを書くときの最初のテンプレートをいくつかメモ
スクリプトの実行
if $0 == __FILE__ # 実行 end
ファイルを更新する
require 'fileutils' require 'tempfile' def update(name) tf = Tempfile.new("foo") File.open(name, 'r').each do |line| # tf.puts(line) end tf.close File.rename(name, name + '.bak') FileUtils.copy_file(tf.path, name) end
Excelシートを巡回する
require 'win32ole' def read_sheets(file) begin excel = WIN32OLE.new('Excel.Application') excel.displayAlerts = false excel.visible = true if $DEBUG book = excel.Workbooks.Open(file) excel.ScreenUpdating = false 1.upto(excel.ActiveWorkbook.Sheets.Count) do |num| do_something(excel.Sheets.item(num)) end excel.ScreenUpdating = true book.close(false) excel.Quit rescue RuntimeError => e p e.backtrace STDERR.puts e.message end end read_sheets(File.expand_path(file))
新規ブック
excel = WIN32OLE.new('Excel.Application') excel.visible = true book = excel.WorkBooks.Add sheet = book.WorkSheets.Item(1) sheet.Name = 'tab name'
行と列の入れ替え
a = [['A1', 'A2', 'A3', 'A4'], ['B1', 'B2', 'B3', 'B4']] sheet.Range(sheet.Cells(1, 1), sheet.Cells(4, 2)).Value = a.transpose #または sheet.Range('A1:B4').Value = a.transpose
シートの内容を配列化
def sheet_to_a(sheet) a = [] cols = sheet.usedRange.Columns.Count 1.upto(sheet.usedRange.Rows.Count) do |rc| c = [] 1.upto(cols) do |cc| c << sheet.cells(rc, cc).value end a << c end a end
ログ付きで子プロセスを実行
def system_with_log(cmd, path) out = STDOUT.dup STDOUT.reopen path, 'w' err = STDERR.dup STDERR.reopen path, 'a' ret = system cmd STDOUT.flush STDOUT.reopen out STDERR.flush STDERR.reopen err ret end
Keyword(s):
References: