Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Bagaimana cara mendapatkan file zip 50MB dengan file xml 600MB ke dalam datatable mysql?

MySQL tidak mengetahui struktur XML Anda. Meskipun dapat mengimpor struktur XML sederhana dan berbentuk baik secara langsung, Anda perlu mengonversi sendiri struktur yang lebih kompleks. Anda dapat membuat CSV, SQL, atau XML (didukung).

Untuk file besar seperti itu XMLReader adalah API terbaik. Pertama buat instance dan buka file:

$reader = new XMLReader();
$reader->open('php://stdin');

Anda menggunakan ruang nama, jadi saya sarankan mendefinisikan array pemetaan untuk mereka:

$xmlns = [
  'a' => 'http://www.abc-example.com'
];

Dimungkinkan untuk menggunakan awalan/alias yang sama seperti dalam file XML, tetapi Anda juga dapat menggunakan milik Anda sendiri.

Selanjutnya jelajahi node XML hingga Anda menemukan node elemen record pertama:

while (
  $reader->read() && 
  ($reader->localName !== 'ABCRecord' ||  $reader->namespaceURI !== $xmlns['a'])
) {
  continue;
}

Anda perlu membandingkan nama lokal (nama tag tanpa awalan namespace) dan URI namespace. Dengan cara ini Anda memprogram tidak bergantung pada awalan sebenarnya dalam file XML.

Setelah Anda menemukan simpul pertama, Anda dapat melintasi ke saudara berikutnya dengan nama lokal yang sama.

while ($reader->localName === 'ABCRecord') {
  if ($reader->namespaceURI === 'http://www.abc-example.com') {
    // read data for the record ...
  }      
  // move to the next record sibling
  $reader->next('ABCRecord');
}

Anda bisa menggunakan XMLReader untuk membaca data rekaman tetapi lebih mudah dengan ekspresi DOM dan XPath. XMLReader dapat memperluas simpul saat ini menjadi simpul DOM. Jadi siapkan dokumen DOM, buat objek XPath untuknya dan daftarkan ruang nama. Memperluas sebuah simpul akan memuat simpul dan semua turunan ke dalam memori, tetapi bukan simpul induk atau saudara kandung.

$dom   = new DOMDocument;
$xpath = new DOMXpath($dom);
foreach ($xmlns as $prefix => $namespaceURI) {
  $xpath->registerNamespace($prefix, $namespaceURI);
}

while ($reader->localName === 'ABCRecord') {
  if ($reader->namespaceURI === 'http://www.abc-example.com') {
    $node = $reader->expand($dom);
    var_dump(
      $xpath->evaluate('string(a:ABC)', $node),
      $xpath->evaluate('string(a:Entity/a:LegalName)', $node)
    );
  }
  $reader->next('ABCRecord');
}

DOMXPath::evaluate() memungkinkan Anda menggunakan ekspresi Xpath untuk mengambil nilai skalar atau daftar simpul dari DOM.

fputcsv() apakah akan sangat mudah untuk menulis data ke dalam CSV.

Satukan:

// open input
$reader = new XMLReader();
$reader->open('php://stdin');

// open output
$output = fopen('php://stdout', 'w');
fputcsv($output, ['id', 'name']);

$xmlns = [
  'a' => 'http://www.abc-example.com'
];

// prepare DOM
$dom   = new DOMDocument;
$xpath = new DOMXpath($dom);
foreach ($xmlns as $prefix => $namespaceURI) {
  $xpath->registerNamespace($prefix, $namespaceURI);
}

// look for the first record element
while (
  $reader->read() && 
  (
    $reader->localName !== 'ABCRecord' || 
    $reader->namespaceURI !== $xmlns['a']
  )
) {
  continue;
}

// while you have an record element
while ($reader->localName === 'ABCRecord') {
  if ($reader->namespaceURI === 'http://www.abc-example.com') {
    // expand record element node
    $node = $reader->expand($dom);
    // fetch data and write it to output
    fputcsv(
      $output, 
      [
        $xpath->evaluate('string(a:ABC)', $node),
        $xpath->evaluate('string(a:Entity/a:LegalName)', $node)
      ]
    );
  }

  // move to the next record sibling
  $reader->next('ABCRecord');
} 

Keluaran:

id,name
5967007LIEEXZX4LPK21,"REGISTERENHETEN I Bornheim"
5967007LIE45ZX4MHC90,"SUNNDAL HOSTBANK"



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara saya mencatat hanya kueri mentah di MySQL?

  2. Tentukan SSL untuk koneksi database MySQL eksternal Heroku

  3. Mengapa saya tidak bisa memasukkan 10 digit ketika kolom saya adalah INT(10)

  4. Conditional ON DUPLICATE KEY UPDATE (Update hanya jika kondisi tertentu benar)

  5. mysql_upgrade gagal - tabel innodb tidak ada?