Почему у меня есть конечный столбец при чтении файла 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 читать файл построчно, а затем выталкивать последнее значение, когда оно вам возвращается.

Другие вопросы по тегам