1

そのため、csv ファイルから指定された数のフィールドを削除する単純な Ruby スクリプトを作成しようとしています。まず、csv ファイルを配列に書き込んでから、その配列を delete_fields メソッドに渡します。フィールドの削除メソッドでは、すべての行のすべての列を繰り返し処理し、列が削除に必要なフィールドの範囲内にあるかどうかを確認します。現時点では、最初の 3 つのフィールドで動作しているように見え、その後 4 番目で停止します。

ここに私のコードがあります:

    require 'csv'
    def read_csv( csv_file )

      arr_of_records = CSV.read( csv_file )


      return arr_of_records
    end

    def remove_fields ( csv_array, new_csv_file, start_field, end_field )
      #file = File.new(new_csv_file, "w")

      csv_array.each_with_index do |row, row_i | 
       row.each_with_index do |column, column_i| 

         column.delete_at(column_i) if ((column_i >= start_field) && (column_i <=     end_field))
         puts column

        end
       end
    end


    remove_fields( read_csv( ARGV[0] ), ARGV[1], ARGV[2].to_i, ARGV[3].to_i )

私が得るエラーは次のとおりです。

    ryan@Alfred:~$ ruby csv_read.rb test_data.csv altered_test_data.csv 3 8
    8
    ?
    ?
    csv_read.rb:16:in `remove_fields': undefined method `delete_at' for   "Lakewoodcity":CSV::Cell (NoMethodError)
from csv_read.rb:1:in `each_with_index'
from csv_read.rb:14:in `each'
from csv_read.rb:14:in `each_with_index'
from csv_read.rb:14:in `remove_fields'
from csv_read.rb:1:in `each_with_index'
from csv_read.rb:13:in `each'
from csv_read.rb:13:in `each_with_index'
from csv_read.rb:13:in `remove_fields'
from csv_read.rb:24

どんな助けでも大歓迎です。

4

1 に答える 1

1

の代わりにdelete_at型のオブジェクトを呼び出しているため、このエラーが発生しています。本当にやりたいことは、現在反復処理を行っている ではなく を呼び出すことです。これで問題が解決するはずです:StringArraydelete_atrowcolumn

  csv_array.each_with_index do |row, row_i | 
   row.each_with_index do |column, column_i| 

     row.delete_at(column_i) if ((column_i >= start_field) && (column_i <=     end_field))
     puts column

    end
   end

これを理解するには、最初のブロック パラメーターをvalueではなく と考えてくださいrow

于 2012-09-25T00:38:10.307 に答える