#! /usr/local/bin/ruby # FT-review-link update-check # 2001.12.28-2002.2.8 # 重複レコード(非重要項目は緩拘束の上で)のチェック項目を追加必要。 #mode_check = true mode_check = false message_mode = 'sjis' require "kconv" #----- def argopt ----- def argopt ( argv, opt2v ) argopt0 = [] argopt1 = [] argopt2 = [] num = '0123456789' flag = false argv.each { |arg| if (arg =~ /^-/) && ((arg[1] < num[0]) || (arg[1] > num[-1])) then flag = false opt2v.each { |opt| flag = true if arg == opt } if flag == false then argopt1 << arg else argopt2 << arg end else if flag == false then argopt0 << arg else argopt2 << arg end flag = false end } newargopt2 = [] 0.upto(argopt2.size - 2) { |i| tmp = [] tmp << argopt2[i] if argopt2[i+1] !~ /^-/ tmp << argopt2[i+1] i = i + 1 end newargopt2 << tmp } if argopt2[argopt2.size - 1] =~ /^-/ newargopt2 << argopt2[argopt2.size - 1] end argopts = [] argopts << argopt0 << argopt1 << newargopt2 return argopts end #----- check arg ----- usage = 'command (no-arg)(book.txt, reviewer.txt, review.txt reviewer_comment.txt -> isbnXXXXXXXXXX.html, list.html, reviewer_XXXXX.html)' opt2v = [] argopts = argopt ( ARGV, opt2v ) case argopts[0].size when 1 input = argopts[0][0] when 2 input = argopts[0][0] output = argopts[0][1] #else # $stderr.puts "Usage: " << usage # exit 1 end flag_isbn = false argopts[1].each { |option| if (option == "-h") || (option == "-help") then $stderr.puts "Usage: " << usage exit 1 end if (option == "-isbn") then $stderr.puts "CHK; check isbn" flag_isbn = true end } #----- def data read ----- def ttcsv_reader ( file = nil, checkkey = nil, checktrack = nil ) $stderr.puts "CHK; file; " << file if file.nil? then fp = $stdin else fp = File.open( file ) end text = [] fp.each {|line| string = Kconv.toeuc(line).chomp.chomp("\r") text << string if string !~ /^#/ } if !file.nil? then fp.close end key = text.shift.split("\t") data = [] text.each_index { |j| record = {} record["track"] = j if checktrack.nil? info = text[j].split("\t") key.each_index { |i| str = info[i] str = '' if str.nil? record[key[i]] = str } data << record } return data if checkkey.nil? return data, key if !checkkey.nil? end def nncomment_reader ( file = nil ) $stderr.puts "CHK; file; " << file if file.nil? then fp = $stdin else fp = File.open( file ) end text = [] fp.each {|line| string = Kconv.toeuc(line).chomp.chomp("\r") text << string if string !~ /^#/ } if !file.nil? then fp.close end data = [] text1 = text.join("\n") text2 = text1.split("\n\n") text2.each { |block| record = {} if block =~ /^(.*?)\n([\S\s]*)$/ then record["r-code"] = $1 record["comment"] = $2 data << record end } return data end #----- def data ----- def data_upcheck (newdata, olddata) newdata.each { |line| olddata.each { |line2| if line == line2 then line["upchk"] = true line2["upchk"] = true end } } newlist = [] oldlist = [] newdata.each_index { |i| newlist << i if newdata[i]["upchk"].nil? } olddata.each_index { |i| oldlist << i if olddata[i]["upchk"].nil? } return newlist, oldlist end def data_output ( data, file = nil ) $stderr.puts "CHK; file; " << file if file.nil? then fp = $stdout else fp = File.open( file, "w" ) end data.each { |key, line| list = [] list << key line.each { |track| list << track } fp.puts list.join("\t") } fp.close end #===== ===== ===== ===== ===== ===== ===== ===== ===== ===== ===== ===== ===== #----- data read ---- dir = '' newbook = ttcsv_reader(dir + "book.txt", nil, "notrack") newreviewer = ttcsv_reader(dir + "reviewer.txt", nil, "notrack") newreview = ttcsv_reader(dir + "review.txt", nil, "notrack") newreviewer_comment = nncomment_reader(dir + "reviewer_comment.txt") newimage_hayakawa = ttcsv_reader(dir + "image_hayakawa.txt", nil, "notrack") newimage_amazon = ttcsv_reader(dir + "image_amazon.txt", nil, "notrack") dir = 'upchk/' oldbook = ttcsv_reader(dir + "book.txt", nil, "notrack") oldreviewer = ttcsv_reader(dir + "reviewer.txt", nil, "notrack") oldreview = ttcsv_reader(dir + "review.txt", nil, "notrack") oldreviewer_comment = nncomment_reader(dir + "reviewer_comment.txt") oldimage_hayakawa = ttcsv_reader(dir + "image_hayakawa.txt", nil, "notrack") oldimage_amazon = ttcsv_reader(dir + "image_amazon.txt", nil, "notrack") #----- add and del check ----- addlist = {} dellist = {} addlist["book"], dellist["book"] = data_upcheck(newbook, oldbook) addlist["review"], dellist["review"] = data_upcheck(newreview, oldreview) addlist["reviewer"], dellist["reviewer"] = data_upcheck(newreviewer, oldreviewer) addlist["reviewer_comment"], dellist["reviewer_comment"] = data_upcheck(newreviewer_comment, oldreviewer_comment) #----- edit info link----- #? hash-search-method ? $stderr.puts "CHK; search review data" #list = (addlist["reviewer_comment"], dellist["reviewer_comment"]).flat newreviewer_comment.each_index { |i| newreviewer.each_index { |j| if newreviewer_comment[i]["r-code"] == newreviewer[j]["r-code"] then newreviewer_comment[i]["reviewer-number"] = j end } } newbook.each{ |line| line["review-list"] = [] } newreviewer.each{ |line| line["book-list"] = [] } newreview.each_index { |i| if newreview[i]["upchk"].nil? then newbook.each_index { |j| if newreview[i]["h-code"] == newbook[j]["h-code"] then newbook[j]["review-list"] << i newreviewer.each_index { |k| if newreview[i]["r-code"] == newreviewer[k]["r-code"] then newreviewer[k]["book-list"] << j end } end } newreviewer.each_index { |j| if newreview[i]["r-code"] == newreviewer[j]["r-code"] then newreview[i]["reviewer-number"] = j end } end } oldreviewer_comment.each_index { |i| oldreviewer.each_index { |j| if oldreviewer_comment[i]["r-code"] == oldreviewer[j]["r-code"] then oldreviewer_comment[i]["reviewer-number"] = j end } } oldbook.each{ |line| line["review-list"] = [] } oldreviewer.each{ |line| line["book-list"] = [] } oldreview.each_index { |i| if oldreview[i]["upchk"].nil? then oldbook.each_index { |j| if oldreview[i]["h-code"] == oldbook[j]["h-code"] then oldbook[j]["review-list"] << i oldreviewer.each_index { |k| if oldreview[i]["r-code"] == oldreviewer[k]["r-code"] then oldreviewer[k]["book-list"] << j end } end } oldreviewer.each_index { |j| if oldreview[i]["r-code"] == oldreviewer[j]["r-code"] then oldreview[i]["reviewer-number"] = j end } end } #----- filename ----- $stderr.puts "CHK; append output filename" newbook.each { |line| isbn = line["isbn"] hcode = line["h-code"] file = 'isbn' + isbn.downcase.gsub(/-/, '') + '.html' if isbn != '' file = 'code' + hcode.downcase.gsub(/-/, '') + '.html' if isbn == '' if (file == 'code.html') then file = nil $stderr.puts "WAR; filename; " + file end line["file"] = file } newreviewer.each { |line| rcode = line["r-code"] file = 'reviewer_' + rcode + '.html' if (file == 'reviewer_.html') then file = nil $stderr.puts "WAR; filename; " + file end line["file"] = file } #----- history data ----- history = [] time = Time.now.strftime("%Y.%m.%d") addlist["book"].each { |track| str = time + "\t" str << '『' + newbook[track]["title"] + '』' str << 'の書籍情報を追加/修正' history << str } dellist["book"].each { |track| str = time + "\t" + '『' + oldbook[track]["title"] + '』の書籍情報を削除' history << str } addlist["reviewer"].each { |track| str = time + "\t" str << '' + newreviewer[track]["reviewer"] + '' str << ' さんの情報を追加/修正' history << str } dellist["reviewer"].each { |track| str = time + "\t" + oldreviewer[track]["reviewer"] + ' さんの情報を削除' history << str } addlist["reviewer_comment"].each { |track| rnum = newreviewer_comment[track]["reviewer-number"] str = time + "\t" str << '' + newreviewer[rnum]["reviewer"] + '' str << ' さんの詳細情報を追加/修正' history << str } dellist["reviewer_comment"].each { |track| rnum = oldreviewer_comment[track]["reviewer-number"] str = time + "\t" + oldreviewer[rnum]["reviewer"] + ' さんの詳細情報を削除' history << str } newreviewer.each { |line| if line["book-list"].size > 0 then str = time + "\t" member = [] line["book-list"].each { |track| str_mem = '『' str_mem << newbook[track]["title"] + '』' member << str_mem } str << member.join + 'に' str << ' ' + line["reviewer"] + ' さん' str << 'の書評を追加/修正' history << str end } oldreviewer.each { |line| if line["book-list"].size > 0 then str = time + "\t" member = [] line["book-list"].each { |track| str_mem = '『' + oldbook[track]["title"] + '』' member << str_mem } str << member.join + 'の ' str << line["reviewer"] + ' さん' str << 'の書評を削除' history << str end } data_output(addlist, "addlist.dat") data_output(dellist, "dellist.dat") if history.size > 0 then file = "history.txt" $stderr.puts "CHK; file; " << file if file.nil? then fp = $stdout else fp = File.open( file, "a" ) end #if file.nil? then # fp.puts "#" + nowtime # fp.puts "date\tinfo" #end history.each { |line| fp.puts line } fp.close end #---------- isbn check ----- if flag_isbn == true then newbook.each{ |line| isbn = line["isbn"].downcase.gsub(/-/, '') digit = 0 0.upto(isbn.size - 2) { |i| digit = digit + isbn[i..i].to_i * (10 - i) } digit = 11 - (digit % 11) check = digit.to_s check = 'x' if digit == 10 check = '0' if digit == 11 if check != isbn[-1..-1].to_s then $stderr.puts "ERR; isbn; " + line["isbn"] end } end