Làm cách nào để tạo bản sao của một số cột của tệp CSV trong Ruby với các dữ liệu khác nhau trong một cột?


84

Tôi có một tệp CSV có tên "A.csv". Tôi cần tạo tệp CSV mới có tên "B.csv" với dữ liệu từ "A.csv".

Tôi sẽ sử dụng một tập hợp con các cột từ "A.csv" và sẽ phải cập nhật giá trị của một cột thành giá trị mới trong "B.csv". Cuối cùng, tôi sẽ sử dụng dữ liệu này từ B.csv để xác thực dựa trên cơ sở dữ liệu.

  1. Làm cách nào để tạo tệp CSV mới?
  2. Làm cách nào để sao chép dữ liệu của các cột bắt buộc từ A.csv sang "B.csv"?
  3. Làm cách nào để nối các giá trị cho một cột cụ thể?

Tôi mới sử dụng Ruby, nhưng tôi có thể đọc CSV để lấy mảng hoặc hàm băm.


2
Điều này thiếu thông tin cơ bản, chẳng hạn như cho chúng tôi thấy nỗ lực của bạn trong việc giải quyết vấn đề. Thông tin này có trong tài liệu CSV. Đọc " Cách hỏi " và " ví dụ có thể tái tạo tối thiểu ".
the Tin Man

Có thể có bản sao của mảng Output thành CSV trong Ruby
phunehehe

Câu trả lời:


191

Như mikeb đã chỉ ra, có các tài liệu - http://ruby-doc.org/stdlib-1.9.3/libdoc/csv/rdoc/CSV.html - Hoặc bạn có thể làm theo các ví dụ bên dưới (tất cả đều được kiểm tra và đang làm việc):

Để tạo một tệp mới:

Trong tệp này, chúng tôi sẽ có hai hàng, một hàng tiêu đề và hàng dữ liệu, CSV rất đơn giản:

require "csv"
CSV.open("file.csv", "wb") do |csv|
  csv << ["animal", "count", "price"]
  csv << ["fox", "1", "$90.00"]
end

kết quả là một tệp có tên "file.csv" với như sau:

animal,count,price
fox,1,$90.00

Cách nối dữ liệu vào CSV

Gần giống như công thức ở trên thay vì sử dụng chế độ "wb", chúng ta sẽ sử dụng chế độ "a +". Để biết thêm thông tin về những điều này, hãy xem câu trả lời tràn ngăn xếp này: Các chế độ và tùy chọn Ruby File.open là gì?

CSV.open("file.csv", "a+") do |csv|
  csv << ["cow", "3","2500"]
end

Bây giờ khi chúng ta mở file.csv, chúng ta có:

animal,count,price
fox,1,$90.00
cow,3,2500

Đọc từ tệp CSV của chúng tôi

Bây giờ bạn biết cách sao chép và ghi vào tệp, đọc CSV và do đó lấy dữ liệu để thao tác bạn chỉ cần làm:

CSV.foreach("file.csv") do |row|
  puts row #first row would be ["animal", "count", "price"] - etc.
end

Tất nhiên, đây giống như một trong hàng trăm cách khác nhau để bạn có thể lấy thông tin từ CSV bằng cách sử dụng đá quý này. Để biết thêm thông tin, tôi khuyên bạn nên truy cập tài liệu bây giờ mà bạn đã có sơ bộ: http://ruby-doc.org/stdlib-1.9.3/libdoc/csv/rdoc/CSV.html


Nếu tôi muốn mở mà không viết thư cho ngay lập tức thì sao? Chỉ cần không sử dụng khối?
Donato

cảm ơn vì mã có thể sao chép và dán! - quá lười để viết nó.
DominikAngerer

Điều này bao gồm việc tạo CSV mới, nhưng sau đó đi vào thông tin về việc thêm và đọc toàn bộ các hàng thay vì giải quyết yêu cầu sao chép một tập hợp con của các cột có sẵn và thay đổi hoặc thêm vào giá trị của chúng. Tôi có cùng loại dự án với OP và không được tài liệu hoặc câu trả lời này giúp đỡ, vì vậy hy vọng tôi có thể quay lại đây để cung cấp câu trả lời cụ thể hơn khi tôi tìm ra.
Tyler James Young

3

Bạn đã xem lớp CSV của Ruby chưa? Nó có vẻ khá toàn diện. Kiểm tra tại đây: http://ruby-doc.org/stdlib-1.9.3/libdoc/csv/rdoc/CSV.html


1
Cảm ơn các liên kết. Tôi sẽ giới thiệu nó. Tôi có thể chỉnh sửa tệp csv thông qua ruby ​​không? Ý tôi là tôi có thể cập nhật giá trị cột trong csv không? sau đó chỉ nhận được băm của các cột bắt buộc?
dùng1718712

0

Có thể bạn sẽ muốn sử dụng CSV::parseđể giúp Ruby hiểu CSV của bạn như một bảng dữ liệu và cho phép dễ dàng truy cập các giá trị theo tiêu đề.

Thật không may, tài liệuCSV::parse có sẵn về phương pháp này không nói rõ cách thực sự sử dụng nó cho mục đích này.

Tôi đã có một nhiệm vụ tương tự và đã được giúp đỡ nhiều hơn bởi Cách đọc & Phân tích cú pháp tệp CSV Với Ruby trên rubyguides.com hơn là bởi tài liệu lớp CSV hoặc bởi các câu trả lời trỏ đến nó từ đây.

Tôi khuyên bạn nên đọc toàn bộ trang đó. Phần quan trọng là về việc chuyển đổi một CSV nhất định thành một CSV::Tableđối tượng bằng cách sử dụng:

table = CSV.parse(File.read("cats.csv"), headers: true)

Bây giờ có tài liệu về CSV::Tablelớp học , nhưng một lần nữa bạn có thể được trợ giúp nhiều hơn bằng các ví dụ rõ ràng trên trang rubyguides.com. Một điều tôi sẽ nhấn mạnh là khi bạn yêu .parsecầu mong đợi tiêu đề, bảng kết quả sẽ coi hàng dữ liệu đầu tiên là hàng [0].

Bạn có thể sẽ đặc biệt quan tâm đến .by_colphương thức có sẵn cho Tableđối tượng mới của bạn . Điều này sẽ cho phép bạn lặp qua các vị trí chỉ mục cột khác nhau trong đầu vào và / hoặc đầu ra và sao chép từ cái này sang cái kia hoặc thêm một giá trị mới vào đầu ra. Nếu tôi làm cho nó hoạt động, tôi sẽ quay lại và đăng một ví dụ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.