Tbpgr Blog

元エンジニア 人事 tbpgr(てぃーびー) のブログ

Ruby | YYYYMM_+任意の文字列形式のファイル名をインクリメントして新規ファイルを作成

概要

YYYYMM_+任意の文字列形式のファイル名をインクリメントして新規ファイルを作成

詳細

任意のフォルダ内にある「YYYYMM_ファイル名.txt」という
命名ルールのファイルを最大の日付+1ヶ月で新規追加する。

サンプルコード

# encoding: Windows-31J

require "date"
require "pp"

class File
   # ファイル名、桁数、拡張子を引数に指定
  def File.get_next_month_file_name(base_filename)
    dates = []
    # 指定した形式のファイルリストを取得
    Dir.glob( base_filename ) do |file|
      # 指定した形式のファイルリストを取得
      dates << Date::new(file.slice(0, 4).to_i, file.slice(4, 2).to_i, "01".to_i)
    end
    
    sufix_name = base_filename.sub("*","")
    if (dates.size == 0)
      # 1ファイルも存在しない場合は、カレント日付で1ファイル目を作成
      dates << Date.today 
      last_date_file = nil
      next_date_file = Date.get_year_month_format(dates[0]) + sufix_name
    else
      dates.reverse!
      last_date = dates[0]
      last_date_file = Date.get_year_month_format(dates[0]) + sufix_name
      next_date_file = Date.get_year_month_format(last_date >> 1) + sufix_name
    end
    
    file_set = [last_date_file, next_date_file]
    return file_set
  end
end

class Date
  def Date.get_year_month_format(date)
    return date.strftime("%Y%m")
  end
end

def copy_file(from_file ,to_file)
  if (from_file)
    open(from_file) do |input|
      open(to_file, "w") do |output|
        output.write(input.read)
      end
    end
  else
    open(to_file, "w")
  end
end

file_set =  File.get_next_month_file_name("*_todo.txt")
copy_file(file_set[0], file_set[1])

出力

1回目実行(カレント日付のファイルが作成される)

$ls | grep _todo
201302_todo.txt

2,3,4回目実行(インクリメントの確認)

$ls | grep _todo
201302_todo.txt
201303_todo.txt
201304_todo.txt
201305_todo.txt