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

From: ichirojiro <ichirojiro@...>
Date: 2009-11-15 10:04:00 UTC
List: ruby-list #46550
ichiroです。
早速ありがとうございます。
ruby -v は
ruby 1.9.1p0 (2009-01-30 revision 21907) [i386-mswin32]
です。

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

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

試しにUTF-8でtest2.csvを作成して実行してみました。

CSV.open("C:\\test2.csv", "r"){|row|p row}
<#CSV io_type:File io_path:"C:\\test2.csv" encoding:Windows-31J lineno:0
col_sep:"," row_sep:"\r\n" quote_char:"\"">

CSV.open("C:\\test2.csv", "r:utf-8"){|row|p row}
<#CSV io_type:File io_path:"C:\\test2.csv" encoding:UTF-8 lineno:0
col_sep:"," row_sep:"\r\n" quote_char:"\"">

なかなかうまくいきません。

> 藤岡です。
> 
> 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