2010-10-20 28 views
5

Tôi đang ghi dữ liệu vào tệp yaml từ ruby ​​và tôi thường xuyên nhận được bí danh phân biệt về tệp. Những điều thích:Ruby YAML viết mà không có bí danh

- &id001 
    somekey: somevalue 
- *id001 

Trong trường hợp của tôi, tôi đang sử dụng các tập tin yaml để viện trợ dễ đọc và thêm tên các giá trị trong các tập tin như các dữ liệu hiện có chỉ là | giá trị tách biệt với không có chìa khóa. Làm cách nào để ngăn các tệp yaml được viết bằng bí danh?

[Chỉnh sửa]

Để biết rõ hơn đây là một ví dụ về các loại dữ liệu và vấn đề.

Dữ liệu gốc trông giống như:

Ham|2.00|1 
Eggs|0.50|12 
Milk|2.00|2 

Và tôi đã viết một kịch bản ruby ​​để chuyển nó sang YAML, mà cũng nhìn vào một file sql để có được những cái tên thích hợp. Tệp yaml trông giống như:

--- 
- !omap 
    - name: Ham 
    - &id001 
    price: 2.00 
    - quantity: 1 
- !omap 
    - name: Eggs 
    - price: 0.50 
    - quantity: 12 
- !omap 
    - name: Milk 
    - *id001 
    - quantity: 1 

Điều này gây ra vấn đề trong tập dữ liệu lớn vì bí danh có thể không ở gần nhau và khó đọc.

+1

Bạn có thể gửi các lớp đó được đăng để YAML này? –

+0

Nó không phải là một lớp đang được đăng, nó là một mảng của YAML :: Omap's. Hy vọng rằng ví dụ làm cho nó rõ ràng hơn. –

Trả lời

2

Tại sao bạn sử dụng YAML :: Omap's?

Một giải pháp đơn giản hơn nhiều và sạch sẽ để lần đầu tiên đọc dữ liệu vào một mảng băm, như vậy:

a = [ {'name' => 'Ham', 'price' => 2.00, 'quantity' => 1}, 
     {'name' => 'Eggs', 'price' => 0.50, 'quantity' => 12}, 
     {'name' => 'Milk', 'price' => 2.00, 'quantity' => 2} ] 

và sau đó chỉ cần làm:

a.to_yaml 

kết quả là:

--- 
- price: 2.0 
    name: Ham 
    quantity: 1 
- price: 0.5 
    name: Eggs 
    quantity: 12 
- price: 2.0 
    name: Milk 
    quantity: 2 

Điều đó có phù hợp với bạn không?

+0

Các tệp yaml tại một số điểm được ghi lại cho các tệp được phân cách bằng đường ống đó. Theo thứ tự này là quan trọng và tôi thấy rằng khi sử dụng băm bình thường, thứ tự của các mục có thể bị xáo trộn. –

+0

Tôi lấy nó bạn đang sử dụng Ruby 1.8, sau đó? Bạn nói đúng, băm không được đặt hàng trong Ruby 1.8, do đó thứ tự của các phần tử có thể thay đổi. Thứ tự của các phần tử có liên quan trong tệp YAML hay chỉ là một đường ống được tách riêng? Nếu vậy, bạn có thể xem xét đơn giản sắp xếp lại các phần tử khi chuyển đổi từ YAML thành tệp được phân tách bằng đường ống. –

+0

Tôi có thể làm điều này nhưng nó sẽ giải quyết được vấn đề của tôi? Bạn có nghĩ thực tế rằng tôi đang sử dụng Omap đang khiến các bí danh được thêm vào không? –

1

Điều này xảy ra vì bạn xuất ra cùng một đối tượng nhiều lần trong cùng một tài liệu. Nếu bạn không muốn bí danh, bạn cần phải dup các đối tượng. Hãy so sánh như sau:

require 'yaml' 

hash = {'a' => 1} 

puts [hash, hash].to_yaml 
puts 
puts [hash, hash.dup].to_yaml 

Output:

--- 
- &1 
    a: 1 
- *1 

--- 
- a: 1 
- a: 1 
0

Nó có thể phức tạp để dup mọi đối tượng để mở rộng các bí danh khi YAML là quá lớn và đã lồng cấu trúc.

Một cách tiếp cận đơn giản (hacky) mà tôi đã sử dụng đã chuyển đổi yaml thành json. và sau đó chuyển nó trở lại YAML. YAML mới không chứa bí danh/neo.

require 'json' 

jsonObj = oldYaml.to_json 
newYaml = YAML.load(jsonObj) 
print newYaml.to_yaml 

Cùng câu trả lời về câu hỏi này: How to emit YAML in Ruby expanding aliases

Các vấn đề liên quan