# 日記ファイル切り出し for ndiary ver.0.1 2002/04/12 by IPPO # original案 有里さん =begin usage: ruby diary_cut.rb 連日日記ファイル.txt 日記ファイル出力用ディレクトリは MYPATH を記述した行以降は、日付行が出てくるまで切り捨て。 日付行は Diary:y.m.d という形式(→Diary:なんらかの符号で連なる3数字=年,月,日)、 形式の融通はかなり効くはず。 Diary前では、 TODO行とWORD行とSCHEDULE行を判定、それぞれの指定ファイルへと切り出し。 各指定ファイル出力用ディレクトリは MYPATH2 =end require 'kconv' #ここの設定は各自の環境に合わせて修正 MYPATH = "../log/2004/" #diary出力用パス MYPATH2 = "../log/" #word,todo,schedule出力用パス TOPIC = /^[*+○●◎□■◇◆△▲▽▼☆★]/s #空行付加トピック EODAY = // #終了行 DATEL = /^Diary:\D*(\d+)\D*(\d+)\D*(\d+)\D*/ #日付行 Diary:yyyy.mm.dd TODO = /^TODO:(.*)$/ #TODO行 TODO:todo.txt WORD = /^WORD:(.*)$/ #WORD行 WORD:word.txt SCHEDULE = /^SCHEDULE:(.*)$/ #SCHEDULE行 SCHEDULE:schedule.txt insystemKcode = 3 #sjis #1-jis,2-euc,3-sjis #ファイル読込 file = ARGF.readlines $stderr.puts 'CHK; read-file; ' + ARGF.to_s + '; ' + file.size.to_s + '-line.' #文字コード変換、改行削除 file.each { |line| line = Kconv.kconv(line.chomp!.chomp!("\r").to_s, insystemKcode) } #日付毎にデータ分割 diarys = [] diary = [] file.each { |line| if line =~ DATEL diarys << diary if diary.join.to_s.size > 0 diary = [] end diary << line } diarys << diary if diary.join.to_s.size > 0 #冒頭ブロックが日記データでない場合、各種ファイル(WORD,TODO,SCHEDULE)切出 if diarys[0][0] !~ DATEL lines = diarys.shift wordfile, todofile, schedulefile = 'word.txt', 'todo.txt', 'schedule.txt' none, word, todo, schedule = [], [], [], [] now = none #データ分割 lines.each { |line| if line =~ WORD wordfile = $1 if $1.to_s.size > 0 wordfile = MYPATH2 + wordfile now = word elsif line =~ TODO todofile = $1 if $1.to_s.size > 0 todofile = MYPATH2 + todofile now = todo elsif line =~ SCHEDULE schedulefile = $1 if $1.to_s.size > 0 schedulefile = MYPATH2 + schedulefile now = schedule else now << line end } #書出 if word.join.to_s.size > 0 word.pop while word[-1].size == 0 $stderr.puts 'CHK; write-file; ' + wordfile open( wordfile, "w" ) { |fp| word.each{ |line| fp.puts line } } end if todo.join.to_s.size > 0 todo.pop while todo[-1].size == 0 $stderr.puts 'CHK; write-file; ' + todofile open( todofile, "w" ) { |fp| todo.each{ |line| fp.puts line } } end if schedule.join.to_s.size > 0 schedule.pop while schedule[-1].size == 0 $stderr.puts 'CHK; write-file; ' + schedulefile open( schedulefile, "w" ) { |fp| schedule.each{ |line| fp.puts line } } end end #日記ファイルの加工(余分な行の削除等) newdiarys = [] diarys.each { |diary| newdiary = [] diary.each { |line| if line =~ EODAY break end newdiary << line if !(line == '' && newdiary[-1] == '') if line =~ TOPIC newdiary << '' end } newdiary.pop while newdiary[-1].to_s.size == 0 newdiarys << newdiary } diarys = newdiarys #日記ファイル書出 diarys.each { |diary| if diary[0] =~ DATEL filename = MYPATH + sprintf("%04d%02d%02d", $1, $2, $3) + '.diary' $stderr.puts 'CHK; write-file; ' + filename open( filename, "w" ) { |fp| fp.puts '<<' #この3行で fp.puts '' #日付行をコメントアウト行として組込、 fp.puts '' if diary[0] != '' #不要であればこの3行をコメントアウト。 diary.each { |line| fp.puts line } } end }