2013-03-19 25 views
7

Tôi đang làm việc trên một số mã C++ tích hợp thông tin từ khoảng vài chục tệp csv. Tất cả chúng đều chứa một số dữ liệu bản ghi được đóng dấu thời gian tôi muốn trích xuất, nhưng biểu diễn có phần khác nhau trong mỗi tệp. Sự khác biệt giữa các biểu diễn vượt ra ngoài các thứ tự cột và tên cột khác nhau - ví dụ, một hàng có nhiều cột trong một tệp có thể là nhiều hàng trong một tệp khác.Các mẫu thiết kế để tổng hợp dữ liệu dạng bảng không đồng nhất

Vì vậy, tôi cần xử lý tùy chỉnh cho từng tệp để tập hợp cấu trúc dữ liệu thống nhất bao gồm thông tin cần thiết từ tất cả các tệp. Câu hỏi của tôi là liệu có một mẫu mã ưa thích để giữ sự phức tạp quản lý và mã thanh lịch? Hoặc nếu có một nghiên cứu điển hình tốt tôi nên kiểm tra để xem cách xử lý sự phức tạp này trong quá khứ.

(Tôi nhận ra một cái gì đó như thế này có thể dễ dàng hơn trong một ngôn ngữ kịch bản như perl, nhưng bây giờ dự án đang ở trong C++. không phải là quá cụ thể về ngôn ngữ.)

+0

Bạn có thể muốn xem một số loại dữ liệu của mình ... – ltjax

+0

Tại gốc của nó, tất cả dữ liệu nguồn có xấp xỉ giống nhau mặc dù các biểu diễn khác nhau không?Và bạn có biết trước khi mở tệp có định dạng trong đó hay không, bạn có phải đọc hàng tiêu đề trước không? –

+0

Tôi biết định dạng apriori, mặc dù không có cách dễ dàng để suy luận theo cấu trúc từ tiêu đề (các quy ước được sử dụng để đặt tên cột và định dạng ngày khác nhau, và trong một số trường hợp, cấu trúc hàng/cột khác nhau giữa các tệp theo ví dụ được đề cập). – daj

Trả lời

3

Có một số cụm từ mà bạn sử dụng trong câu hỏi của mình gắn bó với tôi: custom handling for each file, representation is somewhat different, complexity manageable. Dựa trên thực tế là bạn sẽ phải sử dụng các biến thể khác nhau của thuật toán phân tích dựa trên định dạng của tệp csv và bạn (từ những gì tôi có thể biết) muốn kết hợp một cách lỏng lẻo cơ chế phân tích cú pháp của bạn, tôi sẽ giới thiệu mẫu strategy.

Mẫu chiến lược sẽ tách riêng cơ chế phân tích cú pháp khỏi người dùng dữ liệu chứa trong tệp CSV. Người dùng dữ liệu không quan tâm đến định dạng tệp CSV trong họ chỉ quan tâm đến thông tin trong tệp đó làm cho mẫu chiến lược trở thành lựa chọn tuyệt vời. Nếu có sự tương đồng giữa các cơ chế phân tích cú pháp của bạn, bạn có thể sử dụng cả hai mẫu template và chiến lược với nhau để giảm trùng lặp và tận dụng lợi thế của kế thừa.

Bằng cách sử dụng mẫu chiến lược, bạn có thể trích xuất chiến lược thành factory method hoặc abstract factory khi bạn thấy phù hợp hơn nữa cho phép khách hàng tách riêng khỏi phương pháp phân tích cú pháp.

+0

Đối với mẫu chiến lược, hành vi được chọn trước thời hạn, tùy thuộc vào dữ liệu thời gian chạy. Nó chỉ áp dụng ở đây nếu các tập tin có một tiêu đề để đưa ra một dấu hiệu của định dạng, hoặc nếu chúng hoàn toàn khác nhau. Nó có thể là một khả năng, vì OP không cung cấp bất kỳ thông tin nào về định dạng này. – Thibaut

+0

'được chọn trước thời hạn, tùy thuộc vào dữ liệu thời gian chạy 'có vẻ giống như một mâu thuẫn với tôi. Tuy nhiên, bạn ở ngay trong đó bạn phải có một số chỉ báo về chiến lược nào phù hợp để áp dụng cho tệp CSV cụ thể. Bạn luôn có thể thử tất cả chúng và xem cái nào hoạt động, tuy nhiên đây không phải là giải pháp lý tưởng cho vấn đề. – nattyddubbs

+0

Xin lỗi; điều đó không rõ ràng lắm. Trước thời hạn, ý tôi là trước khi áp dụng nó. Một chiến lược duy nhất được chọn lần đầu tiên khi chạy, sau đó chỉ được áp dụng sau khi nó được chọn. Không có khái niệm vốn có của rollback trong trường hợp bạn chọn chiến lược sai. Loại mẫu này chỉ áp dụng khi bạn có đủ thông tin để chọn đúng chiến lược trước khi sử dụng. – Thibaut

0

Tôi không chắc chắn bạn muốn làm gì với các tệp khác nhau. Nếu ý tưởng là sử dụng chúng như bảng cơ sở dữ liệu và bạn có một số khóa có thông tin đính kèm nằm rải rác trong nhiều tệp, bạn có thể muốn xem một cái gì đó như MapReduce, nơi bạn xây dựng một phần thông tin từ mỗi tệp trước và tổng hợp thông tin chia sẻ cùng một khóa trong bước thứ hai.

Đối với cấu trúc dữ liệu, nó phụ thuộc vào bố cục tệp của bạn. Tôi có lẽ sẽ có một người đọc chuyên dụng cho từng loại tập tin mà sẽ lưu trữ thông tin trong cấu trúc dữ liệu chuyên dụng đại diện cho các thông tin trong tập tin. Bạn có thể đính kèm một khóa cho mỗi thông tin và sử dụng một hoạt động giảm để hợp nhất tất cả các mảnh thông tin bằng cách sử dụng cùng một khóa và tổng hợp chúng trong một cấu trúc proxy. Mặt khác, nếu ý tưởng là xây dựng các đối tượng giống nhau từ các phương thức tuần tự khác nhau (nghĩa là các tệp khác nhau độc lập nhưng đại diện cho cùng một loại dữ liệu với bố cục khác), mà không biết trước phương thức tuần tự nào đã được làm việc, tôi sợ giải pháp duy nhất còn lại là để brute-lực deserialization. Bạn có thể có một bộ đọc, một cho mỗi loại đầu vào, và cố gắng phân tích cú pháp tệp, nếu nó không thành công, bước tiếp theo sẽ bắt đầu và cứ như vậy, cho đến khi bạn phát hiện định dạng tệp mới hoặc tìm trình đọc phù hợp. Tôi không nghĩ rằng có bất kỳ mô hình bao gồm này.

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