2009-03-31 35 views
10

Tôi có một tệp XML 15 GB mà tôi muốn chia nhỏ. Nó có khoảng 300 triệu dòng trong đó. Nó không có bất kỳ nút đầu nào là phụ thuộc lẫn nhau. Có công cụ nào sẵn có để làm điều này cho tôi không?Phân tách XML của một tệp lớn

+0

bạn đã xem vtd-xml chưa? –

Trả lời

3

Tôi nghĩ bạn sẽ phải chia tay theo cách thủ công trừ khi bạn muốn làm theo cách lập trình. Here's a sample thực hiện điều đó, mặc dù nó không đề cập đến kích thước tối đa của các tệp XML được xử lý. Khi thực hiện nó theo cách thủ công, vấn đề đầu tiên nảy sinh là làm thế nào để mở tập tin.

Tôi muốn giới thiệu một trình soạn thảo văn bản rất đơn giản - chẳng hạn như Vim. Khi xử lý các tệp lớn như vậy, luôn luôn hữu ích khi tắt tất cả các dạng tô sáng cú pháp và/hoặc gấp.

Các tùy chọn khác đáng xem xét:

  1. EditPadPro - Tôi chưa bao giờ thử nó với bất cứ điều gì kích thước này, nhưng nếu đó là bất cứ điều gì giống như các sản phẩm JGsoft khác, nó cũng làm việc giống như một làn gió. Hãy nhớ tắt làm nổi bật cú pháp.

  2. VEdit - Tôi đã sử dụng tệp này có kích thước 1GB, hoạt động như thể nó chẳng là gì cả.

  3. EmEditor

+0

Mẫu có trong liên kết được cung cấp để kiểm tra thẻ không? –

+0

Nếu bạn đang hỏi về liên kết CodeProject, tôi nghĩ rằng nó chèn các nút Gốc ở đầu và cuối của mỗi tệp phân tách. – Cerebrus

+0

Thật không may nó đã bị rơi sau 750 MB –

-1

Không phải là công cụ Xml nhưng Ultraedit có thể giúp ích, tôi đã sử dụng nó với các tệp 2G và không hề bận tâm, đảm bảo bạn tắt tính năng tự động sao lưu.

+0

Tôi cần phải chia nó –

+0

Tôi đã thêm một giải pháp vào mục được liên kết http://stackoverflow.com/questions/4325823/how-do-i-split-a-large-xml-file/ –

+0

Đây là hướng dẫn về cách sử dụng UE để tách một tệp lớn http://www.ultraedit.com/support/tutorials_power_tips/ultraedit/split-large-files.html – MrTelly

3

Dưới đây là một kịch bản bộ nhớ thấp để làm điều đó trong trình soạn thảo XML firstobject miễn phí (Foxe) sử dụng chế độ tập tin CMarkup. Tôi không chắc bạn có ý nghĩa gì khi không có các nút trên cùng, hoặc kiểm tra thẻ, nhưng giả sử dưới phần tử gốc bạn có hàng triệu thành phần cấp cao nhất chứa các thuộc tính hoặc hàng của đối tượng cần được giữ lại với nhau thành một đơn vị và bạn muốn nói 1 triệu cho mỗi tập tin đầu ra, bạn có thể làm điều này:

split_xml_15GB() 
{ 
    int nObjectCount = 0, nFileCount = 0; 
    CMarkup xmlInput, xmlOutput; 
    xmlInput.Open("15GB.xml", MDF_READFILE); 
    xmlInput.FindElem(); // root 
    str sRootTag = xmlInput.GetTagName(); 
    xmlInput.IntoElem(); 
    while (xmlInput.FindElem()) 
    { 
    if (nObjectCount == 0) 
    { 
     ++nFileCount; 
     xmlOutput.Open("piece" + nFileCount + ".xml", MDF_WRITEFILE); 
     xmlOutput.AddElem(sRootTag); 
     xmlOutput.IntoElem(); 
    } 
    xmlOutput.AddSubDoc(xmlInput.GetSubDoc()); 
    ++nObjectCount; 
    if (nObjectCount == 1000000) 
    { 
     xmlOutput.Close(); 
     nObjectCount = 0; 
    } 
    } 
    if (nObjectCount) 
    xmlOutput.Close(); 
    xmlInput.Close(); 
    return nFileCount; 
}

tôi đã đăng một đoạn video youtube và bài viết về vấn đề này ở đây:

http://www.firstobject.com/xml-splitter-script-video.htm

0

Bằng cách nào bạn cần phải chia nó? Thật dễ dàng để viết mã bằng cách sử dụng XmlReader.ReadSubTree. Nó sẽ trả về một cá thể xmlReader mới đối với phần tử hiện tại và tất cả các phần tử con của nó. Vì vậy, di chuyển đến đứa con đầu tiên của thư mục gốc, gọi ReadSubtree, viết tất cả các nút đó, gọi Read() bằng cách sử dụng trình đọc gốc và lặp lại cho đến khi hoàn tất.

7

XmlSplit - Một cụ dòng lệnh đó Tách XML lớn tập tin

xml_split - chia tài liệu XML lớn thành những phần nhỏ hơn

Chia rằng XML bằng cách bhayanakmaut (Không mã nguồn và tôi không thể có được một này làm việc)

Một câu hỏi tương tự: How do I split a large xml file?

+0

Lỗi # 16 cho biết giới hạn kích thước tệp tối đa đã vượt quá đối với tệp 1GB. Kích thước tối đa nó có thể chia là bao nhiêu? –

0

QXMLEdit có một chuyên dụng chức năng cho rằng: Tôi sử dụng nó thành công với một bãi chứa Wikipedia. Tập tin ~ 2.7Gio đã trở thành một bó ~ 1 400 000 tệp (một tệp trên mỗi trang). Nó thậm chí còn cho phép bạn gửi chúng trong các thư mục con.

+0

Tôi không biết tại sao bạn bị downvoted, đây là một công cụ mã nguồn mở rất hữu ích. – jeffmcneill

0

Dấu phẩy thư viện nguồn mở có một số công cụ để tìm dữ liệu trong các tệp XML rất lớn và chia các tệp đó thành các tệp nhỏ hơn.

https://github.com/acfr/comma/wiki/XML-Utilities

Các công cụ được xây dựng bằng cách sử dụng phân tích cú pháp SAX người nước ngoài để họ không điền vào bộ nhớ với một cây DOM như xmlstarlet và saxon.

+0

những lỗi này cho tôi trên các tệp nhỏ hơn nhiều (~ 1GB). – blueberryfields

+0

xmlstarlet và saxon không thành công cho chúng tôi vì vậy đó là lý do tại sao tôi đã thêm các công cụ xml vào dấu phẩy. –

0
Used this for splitting Yahoo Q&A dataset 

    count = 0 
    file_count = 1 
    with open('filepath') as f: 

    current_file = "" 

    for line in f: 
     current_file = current_file + line 

     if "</your tag to split>" in line: 
      count = count + 1 

     if count==50000: 
      current_file = current_file + "</endTag>" 
      with open('filepath/Split/file_' +str(file_count)+'.xml' , 'w') as split: 
       split.write(current_file) 
      file_count = file_count + 1 
      current_file = "<?xml version='1.0' encoding='UTF-8'?>\n<endTag>" 
      count = 0 

current_file = current_file + "</endTag>" 
with open('filepath/Split/file_' +str(file_count)+'.xml' , 'w') as split: 
    split.write(current_file) 
Các vấn đề liên quan