2012-06-18 5 views
1

Я пытаюсь пройти каждый файл .xls в каталог и сохранить CSV для каждого файла. Я работаю с драгоценным камнем «roo» и вижу некоторые ошибки. Полностью открытая для других подходов, мне просто нужно сохранить это в Ruby, не переходя в Ruby on Rails. Я запускаю Ruby 1.9.2 и выполняю в терминале на Mac.Ruby save Excel as CSV

код до сих пор:

#! /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

Добавить это: require 'iconv' перед тем require 'roo'. Я нашел это решение here, и я получил его с помощью этого запроса в google: roo/excel.rb:284. Пример here! Обратите внимание на = в этой строке: xls.to_csv = ("/tmp/#{file_basename}.csv"), которого там не должно быть.

+0

Отличное предложение. Я попытался установить iconv и получил много ошибок (добавлен в исходный вопрос). Из того, что я читал, кажется, что это исправление для рубина до 1.9. – analyticsPierce

+1

снова посмотрел на код ура. Я увидел «=» между «xls.to_csv» и «(» /tmp/#{file_basename}.csv). Пожалуйста, удалите его и попробуйте? Извините за это, видел только эту проблему. Надеюсь, что это работает. – David

+1

Да! Спасибо вам за это. Я, вероятно, был бы намного лучшим разработчиком, если бы мог читать и писать. – analyticsPierce

2

Я решил опубликовать ответ, чтобы попытаться объяснить эту ситуацию для всех, кто прибывает сюда из Google.

Как Давид указывает, чтобы исправить эту ошибку ...

uninitialized constant Excel::Iconv 

... Вы должны будете требовать "Iconv":

require "iconv" 
require "roo" 

Это происходит потому, что гем звонки Роо Iconv.new в своем внутреннем классе Excel, но Roo забыл потребовать самого «iconv», поэтому вы вынуждены это делать. Это ошибка. Это ничем не отличается от звонка Set.new без require "set"

Iconv является частью стандартной библиотеки Ruby 1.8 и 1.9. Вы не устанавливаете его. Это уже есть.

Однако стоит отметить, что Iconv устарел в Ruby 1.9 и удален в Ruby 2.0.