ここを読んで
私も perl でためしてみました。
% cat test.pl
#!/usr/bin/perl
while(<>) {
chop;
print "Making a folder $_...\n";
mkdir();
}
% cat 02.txt
ABC_a'bc 織田 信長
ABC_e'fg 豊臣 秀吉
ふげふが リファレンス& ドロー
% ./test.pl 02.txt
Making a folder ABC_a'bc 織田 信長...
Making a folder ABC_e'fg 豊臣 秀吉...
Making a folder ふげふが リファレンス& ドロー...
わざと\s や ' や濁点や & を入れてみましたがちゃんとおかしな名前のフォルダが出来上がりました。
で、Ruby ではどうなのでしょ。
% cat test.rb
#!/path/to/ruby19
# coding: utf-8
ARGF.each{|line|
system ("mkdir #{line}")
}
% ./test.rb 02.txt
% ./test.rb 02.txt
sh: -c: line 0: unexpected EOF while looking for matching `''
sh: -c: line 1: syntax error: unexpected end of file
sh: -c: line 0: unexpected EOF while looking for matching `''
sh: -c: line 1: syntax error: unexpected end of file
sh: ドロー: command not found
こうなるのは予測していたので
http://gihyo.jp/dev/serial/01/ruby/0004?page=2 を読み直し
#!/path/to/ruby19
# coding: utf-8
require 'nkf'
ARGF.each{|line|
ustr = NKF::nkf('--ic=UTF-8 --oc=UTF8-MAC', line)
system ("mkdir #{ustr}")
}
nkf を使ってみました。が、最初と同じエラーが現れ ふげふが/ リファレンス/ の2のフォルダができました。
結果をみると \s のところでパスが区切られてしまったようなので
gustr = ustr.gsub(/\s/, "\\ ")
を挟んでみたものの ”&” でまたパスを区切られてしまいました。結局エラーになりそうな文字(て何?)を全て gsub しないとだめなのかもしれません。いやいやそんなことじゃなく正しい指定(nkf の)さえ分かればいいだけのことなのかもしれません。
あーわからない。
このままで話が終わるのはなんだか後味が悪いので AppleScript で Ruby を呼んでみました。
tell application "Finder"
activate
set cf to choose file with prompt "読み込みたいテキストファイル_UTF-8_を選択してください。"
set dst to choose folder with prompt "保存先フォルダを選択してください。"
set f to quoted form of POSIX path of cf
set rubyfile to quoted form of POSIX path of (((folder of file cf) as text) & "ioread.rb")
# ---------------------------
try
set str to do shell script "/usr/bin/ruby" & space & rubyfile & space & f
set ary to paragraphs of str
if (count of ary) > 3 then # this line
return display dialog "体力の限界です。" buttons {"OK"} default button 1 with title "Oh, NO "
end if
repeat with fname in ary
make new folder at (dst) with properties {name:fname}
end repeat
on error error_str
display dialog error_str buttons {"OK"} default button 1 with title "Error"
end try
end tell
# return AppleScript's version => "2.1.1"
% cat ioread.rb
#!/usr/bin/ruby
f = ARGV[0]
print nil unless f
ary = IO.readlines(f)
ary.delete("\n")
print ary
% ls -F
ABC_a'bc 織田 信長/ ふげふが リファレンス& ドロー/
ABC_e'fg 豊臣 秀吉/
ちゃんとおかしな名前のフォルダができました。
テストなんでフォルダの数は3つまでに制限かけておきました。# this line のところ。
+++ 追記 +++
2010-02-22
しばらくしたら思いつきました。文字ごとに gsub してみようと。
% cat 02.txt
ABC_&a'bc 織田 信長
ABC_e'fg 豊臣 秀吉
ふげふが リファレンス& ドロー
test.rb
1 #!/path/to/ruby19
2 # coding: utf-8
3
4 require 'nkf'
5 def ex(line)
6 mu = String.new("")
7 ary = line.each_char{|x|
8 gx = x.gsub(
9 /[\s\'\(\)\+\!\&\,\[\]\;]/,
10 " "=>"\\ ", "'"=>"\\'",
11 "("=>"\\(", ")"=>"\\)",
12 "+"=>"\\+", "!"=>"\\!",
13 "&"=>"\\&", "."=>"\\.",
14 "ï"=>"\\i", ","=>"\\,",
15 "["=>"\\[", "]"=>"\\]",
16 ";"=>"\\;"
17 )
18 mu << gx
19 }
20 p macustr = NKF::nkf('--ic=UTF-8 --oc=UTF8-MAC', mu)
21 p macustr.encoding
22 system ("mkdir #{macustr}")
23 end
24
25 ARGF.each{|line| ex(line)}
% ./test.rb 02.txt
"ABC_\\&a\\'bc\\ 織田\\ 信長"
#<Encoding:UTF8-MAC>
"ABC_e\\'fg\\ 豊臣\\ 秀吉"
#<Encoding:UTF8-MAC>
"ふげふが\\ リファレンス\\&\\ ドロー"
#<Encoding:UTF8-MAC>
% ls -F
02.txt test.rb*
ABC_&a'bc 織田 信長/ ふげふが リファレンス& ドロー/
ABC_e'fg 豊臣 秀吉/
line 10 "'" を "\\'" とスラッシュバックスラッシュ2つにしてみたらうまくいった。それがなぜなのかは分かっていない。
こういうのは力技と呼ばれることなんだろう。
UTF8-MAC [2] へ続く
[2011-02-19]
2010-02 時点での敗因はただ単にchomp しわすれとsystem コマンド発行する引数を'' で囲まなかったこと。それだけ。びっくりする愚かなおち。
nkf とかね関係ありません...。
それにしても今読み返してつくづく...単純ミスから泥沼していく様は自分でもあきれました。
% cat a.txt
ふげふが &どろー
% cat test.rb
# coding: utf-8
ARGF.each{|x|
s = "\'#{x.strip}\'"
p sh = system("mkdir #{s}")
}
% ruby -v test.rb a.txt
ruby 1.8.7 (2009-06-12 patchlevel 174) [universal-darwin10.0]
true
% ls
a.txt test.rb ふげふが &どろー
ruby 1.9.2
でも同様の結果。
0 件のコメント:
コメントを投稿