2016-03-03 3 views
0

Допустим, я использую код, как это сделать инлайн изменения из CSV файла:Использование заголовков при чтении и редактировании файла CSV с рубином

CSV.open(fn, 'r+') do |f| 
    old_pos = f.pos 
    while r = f.shift 
    if r[0] == 'NOT_PROCESSED' 
     f.seek(old_pos) 
     r[0] = 'PASSED  ' # pay attention to the padding spaces! 
     f << r 
    end 

    old_pos = f.pos 
    end 
end 

Есть ли способ, чтобы каким-то образом использовать заголовки с таким подходом? Как, например, r ['STATUS']? Как мне переписать код, чтобы сделать это возможным?

+0

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

ответ

1

CSV.open имеет третий параметр, называемый options, где вы можете добавить various варианты, в том числе :headers:

: заголовки
Если установлено :first_row или true, начальной строке файла CSV будет обрабатывается как ряд заголовков. Если установлено значение Array, содержимое будет использоваться в качестве заголовков. Если установлено значение String, String запускается по вызову ::parse_line с теми же :col_sep, :row_sep и :quote_char как этот экземпляр для создания массива заголовков. Этот параметр приводит к тому, что #shift возвращает строки как объекты CSV::Row вместо массивов и #read для возврата CSV::Table объектов вместо массива массивов.

CSV.open(fn, 'r+', headers: true) do |f| 
    old_pos = f.pos 
    while r = f.shift 
    if r['STATUS'] == 'NOT_PROCESSED' 
     f.seek(old_pos) 
     r['STATUS'] = 'PASSED  ' # pay attention to the padding spaces! 
     f << r 
    end 

    old_pos = f.pos 
    end 
end 
Смежные вопросы