読者です 読者をやめる 読者になる 読者になる

k_ikiの雑記帳

DTPのこと、創作のことなど、思いつくまま

ちょっと訳ありで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追記・以上)
コピーしたファイルが存在するんだから普通に開けると思ったのに。
中年オヤジ,この時点で根気が尽きる。
もう帰る〜,って感じでした。