Eu tenho um arquivo XML
com 1 GB (cerca de 6000000 linhas). O objetivo é dividir esse arquivo em arquivos .xml
menores com mais ou menos 20000 linhas cada.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ICECAT-interface SYSTEM "http://data.icecat.biz/dtd/files.index.dtd">
<!-- source: Icecat.biz 2012 -->
<ICECAT-interface xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://data.icecat.biz/xsd/files.index.xsd">
<files.index Generated="20120418012252">
<file path="export/level4/PT/726463.xml" Product_ID="726463" Updated="20110815090811" Quality="ICECAT" Supplier_id="393" Prod_ID="174174" Catid="575" On_Market="0" Model_Name="Caplio R4 6.0MPix Silver" Product_View="4052" HighPic="http://images.icecat.biz/img/norm/high/726463-490.jpg" HighPicSize="102843" HighPicWidth="800" HighPicHeight="600" Date_Added="20070219000000">
<EAN_UPCS>
<EAN_UPC Value="4961311027048" />
</EAN_UPCS>
</file>
...
<file path="export/level4/PT/738860.xml" Product_ID="738860" Updated="20101217151007" Quality="ICECAT" Supplier_id="169" Prod_ID="HEJ423020F9AT0C" Catid="219" On_Market="0" Model_Name="Endurastar J4K30" Product_View="1160" HighPic="http://images.icecat.biz/img/norm/high/738860-3355.jpg" HighPicSize="52197" HighPicWidth="175" HighPicHeight="212" Date_Added="20070219000000"></file>
</files.index>
</ICECAT-interface>
Para situações semelhantes, usei split
ou grep
, mas, para esse caso específico, fica mais complicado:
1)
O processo de divisão deve ocorrer sob um nome de nó específico, por exemplo, </file>
para preservar a integridade do arquivo.
2)
Os arquivos de destino devem conter header
e footer
, para tornar o arquivo válido e legível.
CABEÇALHO
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ICECAT-interface SYSTEM "http://data.icecat.biz/dtd/files.index.dtd">
<!-- source: Icecat.biz 2012 -->
<ICECAT-interface xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://data.icecat.biz/xsd/files.index.xsd">
<files.index Generated="20120418012252">
FOOTER
</files.index>
</ICECAT-interface>
3)
Por fim, minha falta de soluções para esse problema se deve ao fato de que essa "ação" será repetida de tempos em tempos em um agendado cron
.
Nota:
Os arquivos de destino podem ter qualquer nome, o diretório permite assumir que é o mesmo onde o script está sendo executado.