NoMethodError: неопределенный метод `map 'для true: TrueClass для отображения заголовков / создания CSV-файлов - PullRequest
0 голосов
/ 02 июля 2019

Я загружаю кучу CSV, чтобы выгрузить их в один большой CSV для экспорта.Я использую Selenium / Ruby / Ruby-on-rails (?) Для достижения этой цели.

Проблема, с которой я сейчас сталкиваюсь, заключается в том, что я получаю

NoMethodError: undefined method `map' for true:TrueClass Did you mean? tap

для следующего кода:

def csv_creation(source)

      l_source = {'lead_source' => source.to_s}

      input_file = Dir.glob("path_to_file/name_of_files*.csv").last

      rows = CSV.open(input_file, headers: true).map(&:to_h)

      rows.each { |h| h.merge!(l_source) }

      headers = rows.first.keys

      rows.first.keys.each { |k| puts k }

      csv_response = CSV.generate do |csv|
        csv << headers

        rows.each do |row|
          csv << row.values_at(*headers)
        end
      end

      File.open("#{source}.csv", "w") { |file| file.write(csv_response) }

      input_files = Dir.glob("#{source}*.csv")

      all_headers = input_files.reduce([]) do |all_header, file|
        header_line = File.open(file, &:gets)

        all_headers | CSV.parse_line(header_line)
      end

      CSV.open("out.csv", "a+") do |out|
        out << all_headers

        input_files.each do |file|
          CSV.foreach(file, headers: true) do |row|

            out << all_headers.map{ |header| row[header] }

          end
        end
      end
    end

Прежде чем мне сказали, что я должен был запустить это на рельсах c и добавить модуль, этот код работал.У меня нет опыта работы с Ruby или RoR, но очевидно, что этот сдвиг нарушил мой код.

Случайные лакомые кусочки:

  • «источник» содержит текст, собранный из выпадающего меню

  • Данный модуль был построен моей принимающей компанией, поэтому я не совсем уверен, что в нем содержится - извините.

  • Rails c не работаетЯ действительно не могу дать мне номер строки, где происходит эта ошибка, но я думаю, что это происходит на второй «карте», поэтому я распечатал некоторые строки, чтобы увидеть, было ли что-то не так, но ничего не было.Это откуда-то получает «истинное» значение, и я, честно говоря, не знаю, где.Все должно быть строкой.

Некоторое понимание будет оценено.

1 Ответ

1 голос
/ 03 июля 2019

Я думаю, что теперь вижу ошибку: как я прокомментировал,

      all_headers = input_files.reduce([]) do |all_header, file|
         header_line = File.open(file, &:gets)
         all_headers | CSV.parse_line(header_line)
     end

не имеет смысла: обратите внимание, что при первом выполнении блока do ... end all_headers равен nil, поскольку переменная была определена, но не назначена. Когда вы вычисляете all_headers | CSV.parse_line(header_line), это эквивалентно nil | [ ... something ...], и это оценивается как true. Это повторяется на каждой итерации, и в конце all_headers получает значение true.

Я думаю, вы имели в виду all_header | CSV.parse_line(header_line)

...