Tôi có một số tệp XML khá lớn đại diện cho dữ liệu được xuất từ một hệ thống sẽ được nhà cung cấp bên thứ ba sử dụng. Tôi đã cắt các kết quả ở 2.500 bản ghi cho mỗi tệp XML vì các tệp trở nên lớn và không thể quản lý được. Tuy nhiên, nhà cung cấp bên thứ 3 đã yêu cầu tôi kết hợp tất cả các tệp XML này thành một tệp duy nhất. Có 78 trong số các tệp XML này và chúng có tổng kích thước hơn 700MB! Crazy, tôi biết ... vậy làm thế nào bạn sẽ đi về việc kết hợp các tập tin này để chứa các nhà cung cấp bằng cách sử dụng C#? Hy vọng rằng có một cách thực sự hiệu quả để thực hiện điều này mà không cần đọc trong tất cả các tệp cùng một lúc bằng cách sử dụng LINQ :-)Cách hiệu quả nhất trong C# để hợp nhất nhiều hơn 2 tệp xml với cùng một lược đồ với nhau?
Trả lời
Tôi sẽ đi ra ngoài chi tiết ở đây và giả sử rằng xml của bạn trông giống như:
Nếu trường hợp đó xảy ra, tôi sẽ mở một luồng tệp và viết phần <records>
, sau đó mở tuần tự từng tệp XML và ghi tất cả các dòng (trừ đĩa đầu tiên và cuối cùng) vào đĩa. Bằng cách đó bạn không có chuỗi lớn trong bộ nhớ và tất cả nên rất, rất nhanh để mã và chạy.
public void ConsolidateFiles(List<String> files, string outputFile)
{
var output = new StreamWriter(File.Open(outputFile, FileMode.Create));
output.WriteLine("<records>");
foreach (var file in files)
{
var input = new StreamReader(File.Open(file, FileMode.Open));
string line;
while (!input.EndOfStream)
{
line = input.ReadLine();
if (!line.Contains("<records>") &&
!line.Contains("</records>"))
{
output.Write(line);
}
}
}
output.WriteLine("</records>");
}
Sử dụng DataSet.ReadXml()
, DataSet.Merge()
, và DataSet.WriteXml()
. Hãy để khung làm công việc cho bạn.
Something như thế này:
public void Merge(List<string> xmlFiles, string outputFileName)
{
DataSet complete = new DataSet();
foreach (string xmlFile in xmlFiles)
{
XmlTextReader reader = new XmlTextReader(xmlFile);
DataSet current = new DataSet();
current.ReadXml(reader);
complete.Merge(current);
}
complete.WriteXml(outputFileName);
}
Đối với mô tả thêm và các ví dụ, hãy nhìn vào this article từ Microsoft.
Đây là tuyến đường ban đầu tôi đã đi. Vấn đề là quá trình này đã kết thúc bằng cách sử dụng một bộ nhớ RAM! –
- 1. Cách hiệu quả để hợp nhất 2 tệp CSS lớn
- 2. Lược đồ thẻ nào hiệu quả nhất?
- 3. Hợp nhất 2 chi nhánh với nhau trong GIT
- 4. cách Hợp nhất hai tệp xml với XSLT
- 5. Cách hiệu quả nhất để phân tích cú pháp Xml
- 6. C++ Cách hiệu quả nhất để so sánh biến với nhiều giá trị?
- 7. Cách tạo lược đồ xml với khóa/keyref cho các phần tử lồng nhau cùng loại
- 8. Hibernate: hợp nhất với nhiều kết quả trong StackOverflowError
- 9. Nhiều gia nhập/hợp nhất với data.tables
- 10. Hợp nhất hai tệp trong linux với cột khác nhau
- 11. Cách hiệu quả nhất để so sánh cấu trúc C++ với C# là gì?
- 12. Xương sống - Hợp nhất 2 Bộ sưu tập với nhau?
- 13. Sử dụng XSD2CODE với nhiều tệp lược đồ
- 14. Hợp nhất hai tệp XML trong Java
- 15. Hợp nhất 2 hình ảnh với node.js?
- 16. Hợp nhất nhiều tệp zip vào một tệp zip duy nhất trong Python
- 17. Cách hiệu quả nhất để tách các chuỗi trong Python
- 18. C#: Mã để phù hợp với LOTS của các tập tin vào một DVD hiệu quả nhất có thể
- 19. Cách hiệu quả nhất để đảo ngược một mảng numpy
- 20. Làm cách nào để hợp nhất hai BST hiệu quả?
- 21. WPF: cách hiệu quả nhất/nhanh nhất để thêm các mục vào một ListView là gì?
- 22. cùng một id đậu trên tập tin xml khác nhau, nó sẽ hợp nhất?
- 23. Số chia chung lớn nhất từ một tập hợp nhiều hơn 2 số nguyên
- 24. Cách hiệu quả nhất để xác thực XML dựa vào XSD
- 25. Hợp nhất nội dung MediaWiki với nhau
- 26. Một lược đồ XML có thể có nhiều targetNameSpaces không?
- 27. Hiệu quả hơn? Càng nhiều lõi hoặc nhiều CPU hơn
- 28. Cách hiệu quả nhất để tạo một CALayer với một hình ảnh trong đó?
- 29. Biểu đồ thanh xếp chồng matplotlib hiệu quả hơn - cách tính các giá trị dưới cùng
- 30. Cách hiệu quả nhất để vẽ các hạt trong HTML5 trên iPad 2
Đây sẽ là cách nhanh nhất, nhưng đó là một chút 'hacky'. –
Đồng ý, 'hacky' tốt nhất: p DataSet.Merge có vẻ thanh lịch hơn nhiều, nhưng tôi không biết làm thế nào hiệu quả bộ nhớ sẽ được. – JustLoren
Tôi có lược đồ được nhúng vào mỗi tệp XML, vì vậy điều này sẽ thậm chí còn nhiều hơn 'hacky' –