From: ichirojiro Date: 2009-11-15T19:04:00+09:00 Subject: [ruby-list:46550] Re: CSV.openがうまく動きません 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 `
' > > 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" >>>> # >>>> "-----" >>>> ["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の変えることで一応解決しています。 >>>> よろしくお願いします。 >>>> >>> > > >