# search_missing.rb
#
# 61007mar.csv から missing_sequence.txt に記載された
# 欠落sequenceを検索する。
#
# sequence : 51～54文字目（Rubyでは line[50,4]）
# 表示範囲 : 34～54文字目（Rubyでは line[33,21]）
#
# 同じsequenceが複数存在する場合は、すべて表示する。

input_file   = "61007mar.csv"
missing_file = "missing_sequence.txt"
output_file  = "search_missing_result.txt"

# missing_sequence.txt から欠落sequenceを読み込む
missing = []

File.foreach(missing_file) do |line|
  sequence = line.strip

  if sequence.length == 4 && sequence =~ /\A[0-9A-Fa-f]{4}\z/
    missing << sequence.upcase
  end
end

# 検索結果
results = {}

missing.each do |sequence|
  results[sequence] = []
end

# 61007mar.csv を全行検索
line_number = 0

File.foreach(input_file) do |line|
  line_number += 1

  sequence = line[50, 4]

  next unless sequence

  sequence = sequence.upcase

  if results.key?(sequence)
    context = line[33, 21]

    results[sequence] << {
      :line_number => line_number,
      :context     => context,
      :line        => line.chomp
    }
  end
end

# 画面表示
puts
puts "========================================"
puts "61007mar.csv 欠落sequence検索結果"
puts "========================================"
puts "検索対象ファイル : #{input_file}"
puts "欠落sequence数   : #{missing.length}"
puts

missing.each do |sequence|

  hits = results[sequence]

  puts "----------------------------------------"
  puts "sequence: #{sequence}"
  puts "ヒット数: #{hits.length}"

  if hits.length == 0
    puts "  → 見つかりませんでした"
  else
    hits.each_with_index do |hit, i|
      puts
      puts "  [#{i + 1}] CSV行: #{hit[:line_number]}"
      puts "      34-54文字: #{hit[:context]}"
    end
  end
end

puts
puts "========================================"

# ファイル保存
File.open(output_file, "w") do |f|

  f.puts "61007mar.csv 欠落sequence検索結果"
  f.puts
  f.puts "検索対象ファイル: #{input_file}"
  f.puts "欠落sequence数: #{missing.length}"
  f.puts

  missing.each do |sequence|

    hits = results[sequence]

    f.puts "----------------------------------------"
    f.puts "sequence: #{sequence}"
    f.puts "ヒット数: #{hits.length}"

    if hits.length == 0

      f.puts "見つかりませんでした"

    else

      hits.each_with_index do |hit, i|

        f.puts
        f.puts "[#{i + 1}] CSV行: #{hit[:line_number]}"
        f.puts "34-54文字: #{hit[:context]}"
        f.puts "元データ:"
        f.puts hit[:line]
      end
    end

    f.puts
  end
end

puts
puts "検索結果保存: #{output_file}"
