Rails CSV удалить столбец с пустым заголовком - PullRequest
0 голосов
/ 16 января 2020

Я получаю CSV-файл с пустыми заголовками, но в этих столбцах есть данные. Я хочу удалить пустой заголовок и связанный с ним столбец в рельсах.

Пример csv

#report
,Code,Price,Orders,,Mark,
1,X91,4.55,4,xxx,F,23

Что бы я хотел вернуть:

Code,Price,Orders,Mark
A91,4.55,4,F

Вот что У меня так же, как есть комментарии к CSV, который я игнорирую.

CSV.open("output.csv", "w") do |output_csv|
          CSV.foreach("out.csv", encoding: "bom|utf-8", skip_lines: /^#/, headers: true).with_index(0) do |row, i|
            output_csv << row.headers if i == 0
            output_csv << row
          end
        end

Ответы [ 2 ]

3 голосов
/ 16 января 2020

Вы можете использовать метод CSV :: Row's delete_if https://ruby-doc.org/stdlib-2.4.1/libdoc/csv/rdoc/CSV/Row.html#method -i-delete_if , что-то вроде:

CSV.open("output.csv", "w") do |output_csv|
  CSV.foreach("out.csv", encoding: "bom|utf-8", skip_lines: /^#/, headers: true) do |row|
    clean_row = row.delete_if { |header, _field| header.blank? }
    output_csv << clean_row.headers if row.header_row?
    output_csv << clean_row
  end
end
2 голосов
/ 16 января 2020

Хотя я в основном согласен с ответом arieljuod , есть несколько вещей, которые могут go ошибаться. row.header_row? всегда будет возвращать false, так как опция return_headers: true не установлена, что исключает заголовок. delete_if - метод мутации, поэтому нет необходимости сохранять результат в переменной. Это только возвращает себя, так что вы можете связать его другими методами.

Следующего будет достаточно:

read_options = {
  encoding: "bom|utf-8",
  skip_lines: /^#/,
  headers: true,
  return_headers: true,
}

CSV.open("output.csv", "w") do |output_csv|
  CSV.foreach("out.csv", read_options) do |row|
    row.delete_if { |header, _field| header.blank? }
    output_csv << row
  end
end

Обратите внимание, что blank? является Ruby в методе Rails, но поскольку вы пометили вопрос с помощью , все будет в порядке.

Из документации CSV::new ( также описываются опции CSV::foreach):

: return_headers

Когда false, строки заголовка молча проглатываются. Если установлено значение true, строки заголовков возвращаются в объекте CSV :: Row с одинаковыми заголовками и полями (за исключением того, что поля не go через преобразователи).

...