■
ちょっと訳ありでSJISテキストの編集
CSVテキストの各フィールド(10列分)の先頭の数字が0なら1に置換したい。
#!usr/bin/ ruby -Ks while line = ARGF.gets line.gsub!(/0(\d\d\d\d\d,)([^,]+,[^,]+,[^,]+,[^,]+,[^,]+,[^,]+,[^,]+,[^,]+,[^,])/) {"1#{$1}#{$2}"} line.gsub!(/,0/) {",1"} print line end
このとき,CSVファイルのファイル名は3桁の数字であり,結構たくさんある。
なので,ターミナルにドロップしたらそのファイル名を受け取り,250プラスしたファイル名に変更した上で書き出したい。
つまり,ターミナル上にはスクリプトファイルと置換元のCSVファイルを投げるだけで,置換先のCSVファイルを自動生成したかったのだ。
下のようなイメージなのかな,と思ってやってみた。
#!usr/bin/ ruby -Ks require "ftools" path_name = File.split(ARGV[0]) file_name = path_name[1].split"." new_name = file_name[0].to_i + 250 nf_name = File.join(path_name[0], new_name.to_s + "." + file_name[1]) File.copy(ARGV[0], nf_name)
2016/04/18追記:csvファイルの中身をいじるわけではないのでエンコードの指定がSJISである必要はない。上記ソースのままだと動かないが、エンコードをKuにしたら動いた。(2016/04/18追記・以上)
一応,プラス250したファイル名のCSVは同じフォルダに出来ている。
最初のスクリプトをくっつけてみる。
#!usr/bin/ ruby -Ks require "ftools" path_name = File.split(ARGV[0]) file_name = path_name[1].split"." new_name = file_name[0].to_i + 250 nf_name = File.join(path_name[0], new_name.to_s + "." + file_name[1]) File.copy(ARGV[0], nf_name) File.open(nf_name, 'w') do |io| while line = io.gets line.gsub!(/0(\d\d\d\d\d,)([^,]+,[^,]+,[^,]+,[^,]+,[^,]+,[^,]+,[^,]+,[^,]+,[^,])/) {"1#{$1}#{$2}"} line.gsub!(/,0/) {",1"} print line end end
IOErrorと怒られちゃった(泣)
2016/04/18追記:csvファイルをユニコードに置換し、エンコードをKuにして試しても、やはりダメだった。(2016/04/18追記・以上)
コピーしたファイルが存在するんだから普通に開けると思ったのに。
中年オヤジ,この時点で根気が尽きる。
もう帰る〜,って感じでした。