郵便番号CSVの整形 on ruby

整形してみた。整形箇所は以下。

  • 複数行で出力されるレコードを1行にまとめる。
  • 不要な箇所を除去
    • "以下に掲載がない場合"
  • Shift_jisUTF-8に変更して出力
  • テスト未実施
  • コードは見直す必要あり。
#! /usr/bin/ruby -Ku
require 'nkf'

def format_zipcode(inFile, outFile)
  kana = ""    # 一時的な変数1
  town = ""    # 一時的な変数2
  flg_process = false

  # 出力ファイルオープン
  File.open(outFile,"wb") { |out_file|
    # 入力ファイルオープン
    File.open(inFile){|file|
      # 1行ずつ読み取り
      while line = file.gets
        # Shift_JISからUTF-8に変換
        # S=Shift_JISで入力/w=UTF8で出力する/Lu=改行コードをLFにする
        # x=半角カナ変換なし/X=半角カナを全角カナへ変換
        line = NKF.nkf('-SwxLu', line)

        # 文字列を配列に変換
        row = line.split(",")

        # 後カッコが閉じられていない箇所を抽出("("または"「")
        if (line.include?("") && ! line.include?("")) #or (line.include?("「") && ! line.include?("」"))
          # 末尾の「"」を除去
          kana = row[5].gsub(/"$/,"")
          town = row[8].gsub(/"$/,"")
          # 後カッコが出るまで同一レコード継続中のフラグを立てる
          flg_process = true
          next
        end
        
        # 前カッコが閉じられていない箇所を抽出(")"または"」")
        if (line.include?("") && ! line.include?("")) #or (line.include?("」") && ! line.include?("「"))
          # 先頭の「"」を除去
          kana = kana + row[5].gsub(/^"/,"")
          town = town + row[8].gsub(/^"/,"")
          row[5] = kana
          row[8] = town
          # 後カッコが出るまで同一レコード終了のフラグを立てる
          flg_process = false
        end

        # 後カッコが出るまで同一レコード継続中の処理
        if flg_process
          # 両端の「"」を除去
          kana = kana + row[5].gsub(/^"/,"").gsub(/"$/,"")
          town = town + row[8].gsub(/^"/,"").gsub(/"$/,"")
          next
        end
        
        # 不要な箇所を削除(空白に置換)
        row[8].gsub!("以下に掲載がない場合", "")
        row[5].gsub!("イカニケイサイガナイバアイ", "")
        
        # ファイル書込み
        # out_file.write(line)
        ##### for debug ######
        #print row.join(",")
#        if row[2] == '"0330072"' or row[2] == '"0660005"'
#          print row.join(",")
#        end
      end
    }
  }
end

out_file = "out.csv"        # 出力ファイル名
in_file = "ken_all.csv"       # 入力ファイル名
format_zipcode(in_file, out_file)