Memoize |
BasicWerk
EC Support
Technique
Facebook
|
20140818110423_ruby_file_encoding_windows_to_unix |
ruby_file_encoding_windows_to_unix
Windows のファイル(Shift_JIS, CRLF)を受け取って、Mac OS X 環境用に UTF-8, LF に変換する Ruby コード。 tou.rb#! /usr/bin/ruby # coding: utf-8 require 'kconv' ARGV.each do |file| dname = File.dirname file bname = File.basename file out = "#{dname}/UTF8_#{bname}" puts "#{file}\t-> #{out}" File.open(out, "w") do |o| File.open(file).each do |line| l = NKF.nkf("-Swx", line) if l[-1] == "\n" o.puts l.chomp else o.print l end end end end
まず kconv は NKF ライブラリの上に築かれている。 はじめは、kconv#toutf8 メソッドを使ったのだが、time で処理速度を計ってみたら、NKF.nkf("-Swx", line) の方が速かった。 -Swx の意味は、「Windows Shift_JIS の文字列を入力に取り(S)、UTF-8 で書きだす(w)。なお、半角カタカナは全角に変換しない(x)。」である。 ただし、改行コードについて NKF.nkf("-Swx --unix", line) とするとなぜか凄く重く(遅く)なってしまったので、CRLF から LF に変換するところは地道にif 式で振り分けてる。 ちなみに受け側が Mac(UNIX) + UTF-8 なので、ソースコードの中で指定した "\n" は LF になる。 また、chomp メソッドは文字列の改行文字が CRLF("\r\n") でも纏めて削除してくれる。
上のスクリプトは、ファイルを読み込んで、ファイル名に UTF8_ という prefix を付けて保存する(File.direname, File.basename を使ってる部分)。
実行するとこんな感じ。 % nkf --guess sjis_file.csv Shift_JIS (CRLF) % tou.rb sjis_file.csv sjis_file.csv -> ./UTF8_sjis_file.csv % nkf --guess ./UTF8_sjis_file.csv UTF-8 (LF)
参考までに、UTF-8, LF から Shift_JIS, CRLF へ変換する Ruby スクリプトも載せておく。 tos.rb#! /usr/bin/ruby # coding: utf-8 require 'kconv' ARGV.each do |file| dname = File.dirname file bname = File.basename file out = "#{dname}/Shift_JIS_#{bname}" puts "#{file}\t-> #{out}" File.open(out, "w") do |o| File.open(file).each do |line| l = "" if line[-1] == "\n" l = "#{line.chomp}\r\n" else l = line end o.print NKF.nkf("-Wsx", l) end end end
改行文字の処理周りが少し違うが基本は一緒。
|
© Shin Nakamura/BasicWerk 2014 |