вівторок, 13 липня 2010 р.

Робота з форматом CSV в Ruby 1.9

Сьогодні мова піде про роботу з форматом CSV в Ruby 1.9.x.
Wikipedia каже:
CSV (від англ. Comma Separated Values - значення, розділені комами) - це текстовий формат, призначений для представлення табличних даних. Кожен рядок файлу - це один рядок таблиці. Значення окремих колонок розділяються розділовим символом (delimiter) - кома (,) або крапку з комою (;). Використовуваний символ роздільника залежить від встановленої в системі локалі. У США це кома, а в Росії - крапка з комою, так як кома використовується для дробових чисел (на відміну від США, де це крапка). Значення, що містять зарезервовані символи, такі як: кома, крапка з комою або новий рядок обрамляються символом подвійні лапки ("); якщо у значенні зустрічаються лапки - вони представляються в файлі у вигляді двох лапок поспіль. Рядки розділяються парою символів CR LF (0x0D 0x0A) (в DOS і Windows ця пара генерується натисканням клавіші Enter).

У Ruby 1.9 стандартна бібліотеки CSV була замінена на FasterCSV.

У прикладі я буду використовувати екпортовану у CSV адресну книгу з Nokia PC Suite. Цей скрипт буде виводити доступну інформацію про контакти.
# -*- encoding: utf-8

require 'csv'
filename = 'contacts.csv'
CSV.foreach(filename, :col_sep => ';', :headers => :first_row, :encoding => 'UTF-8') do |row|
  puts "==="
  row.to_hash.each_pair{|k, v| puts "#{k} => #{v}" if !v.empty?}
end


Опції:
  • row_sep - розлілювач полів (по замовчуванню кома)
  • col_sep - розділювач рядків (по замовчуванню перехід на новий рядок)
  • headers(:first_row означає, що перший рядок трактується, як заголовок)
  • encoding - кодування файлу

Щоб подивитись всі доступні опції виконайте в терміналі:
ri CSV::new

2 коментарі:

Анонім сказав...

Було б добре ще провірити на швидкодію дану задачу.
Та порівняти швидкість з такими лібами як FasterCsv та CCSV (про ccsv я вже писав на хабрі)

Anton Maminov сказав...

Так FasterCSV і використовується в Ruby 1.9 по замовчуванню. Навіть нема що порівнювати. FasterCSV відчутно програє у швидкодії Ccsv. І мені таки не вдалось скомпілювати останній для Ruby 1.9.x.