1

我正在尝试浏览目录中的每个 .xls 文件并为每个文件保存一个 .csv 。我正在使用 'roo' gem 并看到一些错误。对其他方法完全开放,我只需将其保留在 Ruby 中,而无需迁移到 Ruby on Rails。我正在运行 Ruby 1.9.2 并在 Mac 上的终端中执行。

到目前为止的代码:

#! /usr/bin/ruby

require 'roo'


# change excel files to csv
begin
    Dir["/tmp/*.xls"].each do |file|  
      file_path = "#{file}"
      file_basename = File.basename(file, ".xls")
      xls = Excel.new(file_path)
      xls.to_csv = ("/tmp/#{file_basename}.csv")
    end
end

这是我得到的错误:(行号与示例不同,第 27 行是开始语句)

/Users/pierce/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/roo-1.10.1/lib/roo/excel.rb:284:in `platform_specific_iconv': uninitialized constant Excel::Iconv (NameError)
    from /Users/pierce/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/roo-1.10.1/lib/roo/excel.rb:277:in `normalize_string'
    from /Users/pierce/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/roo-1.10.1/lib/roo/excel.rb:139:in `block in sheets'
    from /Users/pierce/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/roo-1.10.1/lib/roo/excel.rb:139:in `collect'
    from /Users/pierce/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/roo-1.10.1/lib/roo/excel.rb:139:in `sheets'
    from /Users/pierce/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/roo-1.10.1/lib/roo/excel.rb:123:in `initialize'
    from excel_conversion_test.rb:32:in `new'
    from excel_conversion_test.rb:32:in `block in <main>'
    from excel_conversion_test.rb:28:in `each'
    from excel_conversion_test.rb:28:in `<main>'

正如建议的那样,我尝试安装 inconv 并收到以下错误:

ERROR:  Error installing iconv:
    ERROR: Failed to build gem native extension.

        /Users/pierce/.rbenv/versions/1.9.2-p290/bin/ruby extconf.rb
checking for iconv() in iconv.h... no
checking for iconv() in -liconv... yes
checking for const of iconv() 2nd argument... no
creating Makefile

make
/usr/bin/gcc-4.2 -I. -I/Users/pierce/.rbenv/versions/1.9.2-p290/include/ruby-1.9.1/x86_64-darwin11.2.0 -I/Users/pierce/.rbenv/versions/1.9.2-p290/include/ruby-1.9.1/ruby/backward -I/Users/pierce/.rbenv/versions/1.9.2-p290/include/ruby-1.9.1 -I. -I'/Users/pierce/.rbenv/versions/1.9.2-p290/include'  -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE   -fno-common -O3 -ggdb -Wextra -Wno-unused-parameter -Wno-parentheses -Wpointer-arith -Wwrite-strings -Wno-missing-field-initializers -Wshorten-64-to-32 -Wno-long-long  -pipe  -o iconv.o -c iconv.c
In file included from iconv.c:21:
/Users/pierce/.rbenv/versions/1.9.2-p290/include/ruby-1.9.1/ruby/backward/st.h:2:2: warning: #warning use "ruby/st.h" instead of bare "st.h"
iconv.c:22:20: error: intern.h: No such file or directory
iconv.c: In function ‘map_charset’:
iconv.c:139: error: ‘struct RHash’ has no member named ‘tbl’
iconv.c:139: error: ‘struct RHash’ has no member named ‘tbl’
iconv.c:142: error: ‘struct RHash’ has no member named ‘tbl’
iconv.c: In function ‘iconv_create’:
iconv.c:187: error: ‘struct RString’ has no member named ‘len’
iconv.c:188: error: ‘struct RString’ has no member named ‘len’
iconv.c:190: error: ‘struct RString’ has no member named ‘ptr’
iconv.c:190: error: ‘struct RString’ has no member named ‘ptr’
iconv.c:190: error: ‘struct RString’ has no member named ‘ptr’
iconv.c:190: error: ‘struct RString’ has no member named ‘ptr’
iconv.c:192: error: ‘struct RString’ has no member named ‘ptr’
iconv.c:193: error: ‘struct RString’ has no member named ‘len’
iconv.c: In function ‘iconv_fail’:
iconv.c:328: error: ‘struct RString’ has no member named ‘len’
iconv.c: In function ‘iconv_fail_retry’:
iconv.c:352: error: ‘ruby_errinfo’ undeclared (first use in this function)
iconv.c:352: error: (Each undeclared identifier is reported only once
iconv.c:352: error: for each function it appears in.)
iconv.c: In function ‘rb_str_derive’:
iconv.c:371: error: ‘struct RString’ has no member named ‘ptr’
iconv.c:371: error: ‘struct RString’ has no member named ‘len’
iconv.c:373: error: ‘struct RString’ has no member named ‘ptr’
iconv.c:373: error: ‘struct RString’ has no member named ‘len’
iconv.c:374: error: ‘struct RString’ has no member named ‘ptr’
iconv.c: In function ‘iconv_convert’:
iconv.c:418: error: ‘struct RArray’ has no member named ‘len’
iconv.c:418: error: ‘struct RArray’ has no member named ‘ptr’
iconv.c:436: error: ‘struct RString’ has no member named ‘len’
iconv.c:437: error: ‘struct RString’ has no member named ‘ptr’
iconv.c:455: warning: comparison of unsigned expression >= 0 is always true
iconv.c:458: warning: comparison between signed and unsigned
iconv.c:459: warning: comparison between signed and unsigned
iconv.c:491: warning: implicit conversion shortens 64-bit value into a 32-bit value
iconv.c:494: warning: implicit conversion shortens 64-bit value into a 32-bit value
iconv.c:497: error: ‘struct RArray’ has no member named ‘len’
iconv.c:498: error: ‘struct RArray’ has no member named ‘ptr’
iconv.c:499: error: ‘struct RArray’ has no member named ‘ptr’
iconv.c:501: error: ‘struct RString’ has no member named ‘len’
iconv.c:502: error: ‘struct RString’ has no member named ‘ptr’
iconv.c:514: warning: implicit conversion shortens 64-bit value into a 32-bit value
iconv.c: In function ‘iconv_s_convert’:
iconv.c:615: error: ‘struct RString’ has no member named ‘len’
make: *** [iconv.o] Error 1


Gem files will remain installed in /Users/pierce/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/iconv-0.1 for inspection.
4

2 回答 2

4

添加这个:require 'iconv'之前require 'roo'。我在这里找到了这个解决方案,然后我在谷歌上使用了这个查询:roo/excel.rb:284这里有一个例子!注意=这一行中的:xls.to_csv = ("/tmp/#{file_basename}.csv")那不应该在那里。

于 2012-06-18T20:31:30.350 回答
2

我决定发布一个答案,试图为从谷歌来到这里的其他人解释这种情况。

正如大卫指出的那样,要修复这个错误......

 uninitialized constant Excel::Iconv

...你必须要求“iconv”:

require "iconv"
require "roo"

这是因为 Roo gemIconv.new在其内部 Excel 类中调用,但 Roo 忘记要求“iconv”本身,所以你不得不这样做。这是一个错误。Set.new这与没有调用没有什么不同require "set"

Iconv 是 Ruby 1.8 和 1.9 标准库的一部分。你不安装它。它已经在那里了。

然而,值得指出的是,Iconv 在 Ruby 1.9 中已被弃用,并在 Ruby 2.0 中被删除。

于 2013-03-14T21:03:25.380 回答