Почему у меня есть конечный столбец при чтении файла CSV?
У меня есть файл CSV со следующей структурой:
"customer_id";"customer_name";"quantity";
"id1234";"Henry";"15";
Разбор со стандартной CSV-библиотекой Ruby:
csv_data = CSV.read(pathtofile,{
:headers => :first_row,
:col_sep => ";",
:quote_char => '"'
:row_sep => "\r\n" #setting it to "\r" or "\n" results in MalformedCSVError
})
puts csv_data.headers.count #4
Я не понимаю, почему анализ, кажется, приводит к четырем столбцам, хотя файл содержит только три. Разве это не правильный подход для разбора файла?
2 ответа
;
в конце каждой строки подразумевается другое поле, хотя значения нет.
Я бы либо убрал трейлинг ;
или просто игнорировать четвертое поле, когда оно анализируется.
Трейлинг ;
виновник
Вы можете предварительно обработать файл, убрав завершающий ;
, но это влечет за собой ненужные накладные расходы.
Вы можете пост-обработать возвращенный массив данных из CSV, используя что-то вроде этого:
csv_data = CSV.read(...).map(&:pop)
Это будет перебирать под-массивы, удаляя последний элемент в каждом. Проблема в том, что read
не масштабируемый, поэтому вы можете переосмыслить его и вместо этого использовать CSV.foreach
читать файл построчно, а затем выталкивать последнее значение, когда оно вам возвращается.