[ruby-list:46549] Re: CSV.openがうまく動きません

From: Fujioka <fuj@...>
Date: 2009-11-15 08:08:17 UTC
List: ruby-list #46549
藤岡です。

ruby -vの結果もあったほうがいいかもしれません。
私は1.9.1の環境はないのですが、

% ruby19 -v
ruby 1.9.2dev (2009-11-06 trunk 25673) [x86_64-darwin10.0.0]

の環境だと、

irb(main):002:0> CSV.open("test.csv","r"){|row|p row}
ArgumentError: invalid byte sequence in UTF-8
	from /Users/fujioka/local/lib/ruby/1.9.1/csv.rb:1988:in `=~'
	from /Users/fujioka/local/lib/ruby/1.9.1/csv.rb:1988:in `init_separators'
	from /Users/fujioka/local/lib/ruby/1.9.1/csv.rb:1564:in `initialize'
	from /Users/fujioka/local/lib/ruby/1.9.1/csv.rb:1329:in `new'
	from /Users/fujioka/local/lib/ruby/1.9.1/csv.rb:1329:in `open'
	from (irb):2
	from /Users/fujioka/local/bin/irb19:12:in `<main>'

irb(main):003:0> CSV.open("test.csv","rb"){|row|p row}
<#CSV io_type:File io_path:"test.csv" encoding:ASCII-8BIT lineno:0
col_sep:"," row_sep:"\r\n" quote_char:"\"">
=> <#CSV io_type:File io_path:"test.csv" encoding:ASCII-8BIT lineno:0
col_sep:"," row_sep:"\r\n" quote_char:"\"">

irb(main):004:0> CSV.open("test.csv","r:sjis"){|row|p row}
<#CSV io_type:File io_path:"test.csv" encoding:Shift_JIS lineno:0
col_sep:"," row_sep:"\r\n" quote_char:"\"">
=> <#CSV io_type:File io_path:"test.csv" encoding:Shift_JIS lineno:0
col_sep:"," row_sep:"\r\n" quote_char:"\"">

こんな感じでした。
ファイルの中身がUTF-8じゃないとrだけではだめなようです。
CSV.open("test.csv","rb")とか"r:sjis"
にしてみるとどうなります?


ichirojiro さんは書きました:
> 藤岡さん
> ご返答ありがとうございます。
> 再現するコードです。
> require 'csv'
> CSV.open("C:\\test.csv", 'r') do |row|
>   p row
> end
> 
> test.csvを添付しました。
> よろしくお願いします。
> 
> 
> 
>> 藤岡です。
>>
>> 短く再現するコードと、
>> test.csvファイルを添付してくださると
>> 検証しやすいのではないでしょうか。
>> もちろん小さいファイルでお願いしたいですが。
>>
>> ichirojiro さんは書きました:
>>> ichiroと申します。
>>> ruby1.8.7で動いているプログラムをruby1.9.1で動くようにする作業中にわから
>>> ないことがありました。よろしければお教えください。
>>>
>>> 単純化したプログラム
>>> # encoding: ASCII-8BIT
>>> p RUBY_VERSION
>>> p RUBY_PLATFORM
>>> p __ENCODING__
>>> require 'csv'
>>> p "-----"
>>> CSV.foreach("C:\\test.csv") do |row|
>>>   p row
>>> end
>>> p "-----"
>>> CSV.open("C:\\test.csv", 'r') do |row|
>>>   p row
>>> end
>>> p "-----"
>>>
>>> 実行結果(windows XP RDEで実行しています)
>>> "1.9.1"
>>> "i386-mswin32"
>>> #<Encoding:ASCII-8BIT>
>>> "-----"
>>> ["111", "222", "\x8ER"]
>>> ["333", "444", "\x90\xEC"]
>>> "-----"
>>> <#CSV io_type:File io_path:"C:\\test.csv" encoding:Windows-31J lineno:0
>>> col_sep:"," row_sep:"\r\n" quote_char:"\"">
>>> "-----"
>>> Complete(0)
>>>
>>> 1.8.7で動いていたプログラムを1.9.1で動かすとCSV.openのところで処理が進ま
>>> なくなりました。試しに50行ぐらいあるcsvデータを10行程度に減らすと処理は
>>> 進むようにはなったのですが上記のようなrowデータが1件のみ得られるようにな
>>> りました。いろいろ試してみてCSV.foreachなら上記のようにうまく動いたので
>>> CSV.openをすべてCSV.foreachの変えることで一応解決しています。
>>> よろしくお願いします。
>>>
>>
>>
> 


In This Thread