07/09/2018, 11:11

Cách Đọc CSV File trong Ruby

Ngôn ngữ Ruby hỗ trợ sẵn thư viện đọc các dữ liệu văn bản địh dạng theo format CSV (comma separated file). Trong bài viết này chúng ta sẽ tìm hiểu cách sử dụng thư viện CSV này. CSV file là kiểu lưu trữ văn bản dưới định dạng phân cách bởi dấu phảy ,. Một file CSV bao gồm một hoặc nhiều dòng và ...

Ngôn ngữ Ruby hỗ trợ sẵn thư viện đọc các dữ liệu văn bản địh dạng theo format CSV (comma separated file). Trong bài viết này chúng ta sẽ tìm hiểu cách sử dụng thư viện CSV này.

CSV file là kiểu lưu trữ văn bản dưới định dạng phân cách bởi dấu phảy ,. Một file CSV bao gồm một hoặc nhiều dòng và cột trong đó dữ liệu của các cột khác nhau trong cùng một dòng được phân biệt bởi đấu phảy.

Tạo Tập Tin CSV

Trước tiên bạn hãy tạo một tập tin CSV đặt tên là students.csv trên máy với nội dung như sau:

Họ Tên,Năm Sinh,Khoá Học,Ngành Học
Nguyễn Văn An,2003,K21,Công Nghệ Phần Mềm
Trần Văn Bình,2003,K21,Khoa Học Máy Tính
Phạm Thị Thu Cúc,2003,K21,Khoa Học Máy Tính

Nếu mở trên phần mềm đọc file CSV bạn sẽ thấy kết quả như sau:

Hiển Thị Nội Dung File CSV

Đọc CSV File Với CSV Class trong Ruby

Class CSV của Ruby được đóng gói trong thư viện csv của Ruby (hay Ruby gem). Để sử dụng thư viện này bạn cần import nó:

require "csv"

Sau đó bạn có thể sử dụng class CSV để đọc file lưu theo định dạng CSV:

require "csv"
students = CSV.read("students.csv")
print students

Đoạn code trên sử dụng method read của class CSV để đọc nội dung tập tin students.csv. Kết quả trả về của method này là một mảng array bao gồm nhiều phần tử, mỗi phần tử ứng với một dòng trong tập tin và cũng là một mảng chứa dữ liệu các cột trong dòng đó:

[["Họ Tên", "Năm Sinh", "Khoá Học", "Ngành Học"], ["Nguyễn Văn An", "2003", "K21", "Công Nghệ Phần Mềm"], ["Trần Văn Bình", "2003", "K21", "Khoa Học Máy Tính"], ["Phạm Thị Thu Cúc", "2003", "K21", "Khoa Học Máy Tính"]] 

Nhươc điểm của method CSV.read() đó là Ruby sẽ đọc toàn bộ dữ liệu của tập tin vào bộ nhớ tạm (RAM). Do đó cách làm trên sẽ chỉ thích hợp với những tập tin kích thước nhỏ vì đối với các tập tin lớn cách làm này sẽ gây ra lỗi tràn bộ nhớ trên máy tính.

Cách làm khác phù hợp hơn đó là đọc từng dòng trong file sử dụng method CSV.foreach():

require "csv"
CSV.foreach('students.csv') do |row|
  // 
  puts row.inspect
end

Kết quả của cách này tương tự như cách trên:

["Họ Tên", "Năm Sinh", "Khoá Học", "Ngành Học"]
["Nguyễn Văn An", "2003", "K21", "Công Nghệ Phần Mềm"]
["Trần Văn Bình", "2003", "K21", "Khoa Học Máy Tính"]
["Phạm Thị Thu Cúc", "2003", "K21", "Khoa Học Máy Tính"]

Ngoài ra bạn cũng có thể sử dụng CSV kết hợp với File class để đọc nội dung file CSV:

require "csv"
CSV.parse(File.read('customers.csv'))

Cách làm này tương tự như CSV.read() và cũng có khả năng gây ra lỗi tràn bộ nhớ.

Kết Luận

Trong bài viết này chúng ta đã tìm hiểu các cách khác nhau để đọc nội dung một tập tin theo định dạng CSV. Đối với hầu hết các trường hợp bạn nên sử dụng CSV.foreach() để đọc nội dung tập tin theo dòng vì cách làm này không những giúp tránh gặp phải lỗi tràn bộ nhớ mà source code của bạn cũng trông gọn gàng hơn.

0