将两个txt文件转换为单个XML文件

时间:2019-11-24 17:42:10

标签: php xml merge

我每天收到两个文本文件。一个拥有车辆信息,另一个具有经销商信息。我在下面的脚本中不使用XMLWriter来将它们转换为xml。有没有一种方法可以使用一个公共节点将两个txt文件解析为一个XML文档?公用节点是FRANCHISE_ID。

我使用以下脚本将它们转换为xml:

<?php
$data = fopen('dealers_retail.txt', 'r');
    $xml = new XMLWriter;
    $xml->openURI('dealers_retail.xml');
    $xml->setIndent(true); // makes output cleaner
    $xml->startElement('DATA');
    $flag = true;
    while ($line = fgetcsv($data, 0, '|')) {
        if($flag) { $flag = false; continue; }
       $xml->startElement('ITEM');
       $xml->writeElement('FRANCHISE_ID', $line[0]);
       $xml->writeElement('FRANCHISE_NAME', str_replace("~", "", $line[1]));
       $xml->writeElement('FRANCHISE_ADDRESS', str_replace("~", "", $line[2]));
       $xml->writeElement('FRANCHISE_CITY', str_replace("~", "", $line[3]));
       $xml->writeElement('FRANCHISE_STATE', str_replace("~", "", $line[4]));
       $xml->writeElement('FRANCHISE_ZIP', str_replace("~", "", $line[5]));
       $xml->endElement();
    }
    $xml->endElement();
?>

哪个输出:

<DATA>
 <ITEM>
  <FRANCHISE_ID>12345</FRANCHISE_ID>
  <FRANCHISE_NAME>Mercedes-Benz of XXX</FRANCHISE_NAME>
  <FRANCHISE_ADDRESS>2915 Some Street</FRANCHISE_ADDRESS>
  <FRANCHISE_CITY>Oakland</FRANCHISE_CITY>
  <FRANCHISE_STATE>CA</FRANCHISE_STATE>
  <FRANCHISE_ZIP>94611</FRANCHISE_ZIP>
 </ITEM>
</DATA>

AND

<?php
$data = fopen('inventory_retail.txt', 'r');
    $xml = new XMLWriter;
    $xml->openURI('inventory_retail.xml');
    $xml->setIndent(true); // makes output cleaner
    $xml->startElement('DATA');
    $flag = true;
    while ($line = fgetcsv($data, 0, '|')) {
        if($flag) { $flag = false; continue; }
       $xml->startElement('ITEM');
       $xml->writeElement('FRANCHISE_ID', $line[0]);
       $xml->writeElement('VEHICLE_VIN', str_replace("~", "", $line[1]));
       $xml->writeElement('LISTING_ID', str_replace("~", "", $line[1]));
       $xml->writeElement('LIST_PRICE', str_replace("~", "", $line[2]));
       $xml->writeElement('VEHICLE_YEAR', str_replace("~", "", $line[3]));
       $xml->writeElement('MAKE_DESC', str_replace("~", "", $line[4]));
       $xml->writeElement('MODEL_DESC', str_replace("~", "", $line[5]));
       $xml->writeElement('TRIM', str_replace("~", "", $line[6]));
       $xml->writeElement('SKU', str_replace("~", "", $line[7]));
       $xml->writeElement('BODY_TYPE', str_replace("~", "", $line[8]));
       $xml->writeElement('ADF_BODY_TYPE', str_replace("~", "", $line[8]));
       $xml->writeElement('DRIVE_TYPE', str_replace("~", "", $line[9]));
       $xml->writeElement('ENGINE_DESC', str_replace("~", "", $line[10]));
       $xml->writeElement('VEHICLE_FUEL_TYPE', str_replace("~", "", $line[11]));
       $xml->writeElement('TRANSMISSION', str_replace("~", "", $line[12]));
       $xml->writeElement('ADF_TRANSMISSION', str_replace("~", "", $line[12]));
       $xml->writeElement('MILEAGE', str_replace("~", "", $line[13]));
       $xml->writeElement('NUMBER_OF_CYLINDERS', str_replace("~", "", $line[14]));
       $xml->writeElement('NUMBER_OF_DOORS', str_replace("~", "", $line[15]));
       $xml->writeElement('COLOR_DESC', str_replace("~", "", $line[16]));
       $xml->writeElement('INTERIOR_COLOR', str_replace("~", "", $line[17]));
       $xml->writeElement('INTERIOR_TYPE', str_replace("~", "", $line[18]));
       $xml->writeElement('REFERENCE_DATE', str_replace("~", "", $line[19]));
       $xml->writeElement('OPTIONS_DESC', str_replace("~", "", $line[20]));
       $xml->writeElement('AUDIO_DESC', str_replace("~", "", $line[21]));
       $xml->writeElement('SUN_ROOF', str_replace("~", "", $line[22]));
       $xml->writeElement('ALARM_SYSTEM', str_replace("~", "", $line[23]));     
       $xml->writeElement('POWER_WINDOWS', str_replace("~", "", $line[24]));
       $xml->writeElement('POWER_LOCKS', str_replace("~", "", $line[25]));
       $xml->writeElement('AIRBAGS', str_replace("~", "", $line[26]));
       $xml->writeElement('AIR_CONDITIONING', str_replace("~", "", $line[27]));
       $xml->writeElement('CRUISE_CONTROL', str_replace("~", "", $line[28]));
       $xml->writeElement('TILT_STEERING', str_replace("~", "", $line[29]));
       $xml->writeElement('POWER_STEERING', str_replace("~", "", $line[30]));
       $xml->writeElement('POWER_SEATS', str_replace("~", "", $line[31]));
       $xml->writeElement('PROMOTIONAL_TEXT', str_replace("~", "", $line[32]));
       $xml->writeElement('OEM_CERTIFIED', str_replace("~", "", $line[33]));
       $xml->writeElement('WARRANTY_DESC', str_replace("~", "", $line[34]));
       $xml->writeElement('PHOTO_AVAILABLE_FLAG', str_replace("~", "", $line[35]));     
       $xml->writeElement('PHOTO_URL', str_replace("~", "", $line[36]));    
       $xml->writeElement('SELLER_TYPE', seller_type_cdcretail);    
       $xml->writeElement('CONDITION_RADIO', used);
       $xml->writeElement('CONDITION_CHECKBOX', used);
       $xml->writeElement('ADF_CONDITION', used);
       $xml->writeElement('USE_ACCOUNT_ADDRESS', 1);
       $xml->writeElement('COUNTRY', 'united states');
       $xml->endElement();
    }
    $xml->endElement();
?>

哪个输出:

<DATA>
  <ITEM>
    <FRANCHISE_ID>12345</FRANCHISE_ID>
    <VEHICLE_VIN>12345678901234567</VEHICLE_VIN>
    <LISTING_ID>12345678901234567</LISTING_ID>
    <LIST_PRICE>47986</LIST_PRICE>
    <VEHICLE_YEAR>2019</VEHICLE_YEAR>
    <MAKE_DESC>Mercedes-Benz</MAKE_DESC>
    <MODEL_DESC>E-Class</MODEL_DESC>
    <TRIM>E 300</TRIM>
    <SKU>9999999999</SKU>
    <BODY_TYPE>4dr Car</BODY_TYPE>
    <ADF_BODY_TYPE>4dr Car</ADF_BODY_TYPE>
    <DRIVE_TYPE>RWD</DRIVE_TYPE>
    <ENGINE_DESC>Intercooled Turbo Premium Unleaded I-4 2.0 L/121</ENGINE_DESC>
    <VEHICLE_FUEL_TYPE/>
    <TRANSMISSION>9-Speed Automatic w/OD</TRANSMISSION>
    <ADF_TRANSMISSION>9-Speed Automatic w/OD</ADF_TRANSMISSION>
    <MILEAGE>7446</MILEAGE>
    <NUMBER_OF_CYLINDERS/>
    <NUMBER_OF_DOORS>4</NUMBER_OF_DOORS>
    <COLOR_DESC>White</COLOR_DESC>
    <INTERIOR_COLOR>Black Leather</INTERIOR_COLOR>
    <INTERIOR_TYPE/>
    <REFERENCE_DATE/>
    <OPTIONS_DESC>Turbocharged, Rear Wheel Drive</OPTIONS_DESC>
    <AUDIO_DESC/>
    <SUN_ROOF/>
    <ALARM_SYSTEM/>
    <POWER_WINDOWS/>
    <POWER_LOCKS/>
    <AIRBAGS/>
    <AIR_CONDITIONING/>
    <CRUISE_CONTROL/>
    <TILT_STEERING/>
    <POWER_STEERING/>
    <POWER_SEATS/>
    <PROMOTIONAL_TEXT>PRICE REDUCED, CERTIFIED</PROMOTIONAL_TEXT>
    <OEM_CERTIFIED>0</OEM_CERTIFIED>
    <WARRANTY_DESC/>
    <PHOTO_AVAILABLE_FLAG>1</PHOTO_AVAILABLE_FLAG>
    <PHOTO_URL>http://content.jpg</PHOTO_URL>
    <SELLER_TYPE>seller_type_cdcretail</SELLER_TYPE>
    <CONDITION_RADIO>used</CONDITION_RADIO>
    <CONDITION_CHECKBOX>used</CONDITION_CHECKBOX>
    <ADF_CONDITION>used</ADF_CONDITION>
    <USE_ACCOUNT_ADDRESS>1</USE_ACCOUNT_ADDRESS>
    <COUNTRY>united states</COUNTRY>
  </ITEM>
</DATA>

我要实现以下输出:

<DATA>
  <ITEM>
    <FRANCHISE_ID>12345</FRANCHISE_ID>
    <VEHICLE_VIN>12345678901234567</VEHICLE_VIN>
    <LISTING_ID>12345678901234567</LISTING_ID>
    <LIST_PRICE>47986</LIST_PRICE>
    <VEHICLE_YEAR>2019</VEHICLE_YEAR>
    <MAKE_DESC>Mercedes-Benz</MAKE_DESC>
    <MODEL_DESC>E-Class</MODEL_DESC>
    <TRIM>E 300</TRIM>
    <SKU>9999999999</SKU>
    <BODY_TYPE>4dr Car</BODY_TYPE>
    <ADF_BODY_TYPE>4dr Car</ADF_BODY_TYPE>
    <DRIVE_TYPE>RWD</DRIVE_TYPE>
    <ENGINE_DESC>Intercooled Turbo Premium Unleaded I-4 2.0 L/121</ENGINE_DESC>
    <VEHICLE_FUEL_TYPE/>
    <TRANSMISSION>9-Speed Automatic w/OD</TRANSMISSION>
    <ADF_TRANSMISSION>9-Speed Automatic w/OD</ADF_TRANSMISSION>
    <MILEAGE>7446</MILEAGE>
    <NUMBER_OF_CYLINDERS/>
    <NUMBER_OF_DOORS>4</NUMBER_OF_DOORS>
    <COLOR_DESC>White</COLOR_DESC>
    <INTERIOR_COLOR>Black Leather</INTERIOR_COLOR>
    <INTERIOR_TYPE/>
    <REFERENCE_DATE/>
    <OPTIONS_DESC>Turbocharged, Rear Wheel Drive</OPTIONS_DESC>
    <AUDIO_DESC/>
    <SUN_ROOF/>
    <ALARM_SYSTEM/>
    <POWER_WINDOWS/>
    <POWER_LOCKS/>
    <AIRBAGS/>
    <AIR_CONDITIONING/>
    <CRUISE_CONTROL/>
    <TILT_STEERING/>
    <POWER_STEERING/>
    <POWER_SEATS/>
    <PROMOTIONAL_TEXT>PRICE REDUCED, CERTIFIED</PROMOTIONAL_TEXT>
    <OEM_CERTIFIED>0</OEM_CERTIFIED>
    <WARRANTY_DESC/>
    <PHOTO_AVAILABLE_FLAG>1</PHOTO_AVAILABLE_FLAG>
    <PHOTO_URL>http://content.jpg</PHOTO_URL>
    <SELLER_TYPE>seller_type_cdcretail</SELLER_TYPE>
    <CONDITION_RADIO>used</CONDITION_RADIO>
    <CONDITION_CHECKBOX>used</CONDITION_CHECKBOX>
    <ADF_CONDITION>used</ADF_CONDITION>
    <USE_ACCOUNT_ADDRESS>1</USE_ACCOUNT_ADDRESS>
    <COUNTRY>united states</COUNTRY>
    <FRANCHISE_NAME>Mercedes-Benz of XXX</FRANCHISE_NAME>
    <FRANCHISE_ADDRESS>2915 Some Street</FRANCHISE_ADDRESS>
    <FRANCHISE_CITY>Oakland</FRANCHISE_CITY>
    <FRANCHISE_STATE>CA</FRANCHISE_STATE>
    <FRANCHISE_ZIP>94611</FRANCHISE_ZIP>
  </ITEM>
</DATA>

我尝试了以下操作,该操作仅将经销商数据复制到属于该经销商的第一辆车。我不知道如何将其应用于特定经销商的每辆车:

<?php

$data = fopen('usacarshopucr_used_inventory_retail.txt', 'r');
// Skip header
fgetcsv($data, 0, '|');
$xml = simplexml_load_string("<DATA />");
// Array which translates the field name to the field in the input file
$itemData = ['FRANCHISE_ID' => 0, 'VEHICLE_VIN' => 1, 'LISTING_ID' => 1,
    'LIST_PRICE' => 2, 'VEHICLE_YEAR' => 3,
    'MAKE_DESC' => 4, 'MODEL_DESC' => 5
];

while ($line = fgetcsv($data, 0, '|')) {
    $item = $xml->addChild("ITEM");
    // Copy the data from the input file to the XML
    foreach ( $itemData as $name => $itemElement )   {
        $item->addChild($name, str_replace("~", "", $line[$itemElement]));
    }
}

$data = fopen('usacarshopucr_used_dealers_retail.txt', 'r');
fgetcsv($data, 0, '|');

// You will need to add all of the fields in here, this is just to show
// how to start.  Don't add the fields with a fixed value, these are added
// in separately
$itemData = ['FRANCHISE_NAME' => 1,
    'FRANCHISE_ADDRESS' => 2, 'FRANCHISE_CITY' => 3,
    'FRANCHISE_STATE' => 4, 'FRANCHISE_ZIP' => 5
];
while ($line = fgetcsv($data, 0, '|')) {
    // Find the matching item in the existing XML for the FRANCHISE_ID
    $item = $xml->xpath('//ITEM[FRANCHISE_ID="'.$line[0].'"]')[0];
    // Copy the data from the input file to the XML
    foreach ( $itemData as $name => $itemElement )   {
        $item->addChild($name, str_replace("~", "", $line[$itemElement]));
    }

    // Add in fixed data - again finish this part off
    $item->addChild('CONDITION_RADIO', 'used');
    $item->addChild('ADF_CONDITION', 'used');
}
$xml->asXML('simple_inventory_retail-2.xml');

?>

它输出:

<?xml version="1.0"?>
<DATA>
    <ITEM>
        <FRANCHISE_ID>236057</FRANCHISE_ID>
        <VEHICLE_VIN>4JGDF6EE4GA708047</VEHICLE_VIN>
        <LISTING_ID>4JGDF6EE4GA708047</LISTING_ID>
        <LIST_PRICE>39300</LIST_PRICE>
        <VEHICLE_YEAR>2016</VEHICLE_YEAR>
        <MAKE_DESC>Mercedes-Benz</MAKE_DESC>
        <MODEL_DESC>GL</MODEL_DESC>
        <FRANCHISE_NAME>Malone's Automotive</FRANCHISE_NAME>
        <FRANCHISE_ADDRESS>1827 Lower Roswell Road</FRANCHISE_ADDRESS>
        <FRANCHISE_CITY>Marietta</FRANCHISE_CITY>
        <FRANCHISE_STATE>GA</FRANCHISE_STATE>
        <FRANCHISE_ZIP>30068</FRANCHISE_ZIP>
        <CONDITION_RADIO>used</CONDITION_RADIO>
        <ADF_CONDITION>used</ADF_CONDITION>
    </ITEM>
    <ITEM>
        <FRANCHISE_ID>236057</FRANCHISE_ID>
        <VEHICLE_VIN>WA1L2AFP5GA039814</VEHICLE_VIN>
        <LISTING_ID>WA1L2AFP5GA039814</LISTING_ID>
        <LIST_PRICE>26990</LIST_PRICE>
        <VEHICLE_YEAR>2016</VEHICLE_YEAR>
        <MAKE_DESC>Audi</MAKE_DESC>
        <MODEL_DESC>Q5</MODEL_DESC>
    </ITEM>

3 个答案:

答案 0 :(得分:0)

是的,您可以将2个传入文件中的2个数组合并为一个,只有在创建xml文件之后。

$flag = true;

$mergedArray = [];  // this array will contain all data
// insert data from first file
while ($line = fgetcsv($data_from_first_file, 0, '|')) {
    if($flag) { $flag = false; continue; }
     $mergedArray[$line[0]]['FRANCHISE_ID'] = $line[0];
     // and so on ...

}
// insert data from second file
$flag = true;

while ($line = fgetcsv($data_from_second_file, 0, '|')) {
    if($flag) { $flag = false; continue; }
     $mergedArray[$line[0]]['VEHICLE_VIN'] =  str_replace("~", "", $line[1]);
     // and so on ...

}
// now just foreach over the array to create the XML
// ...
$xml = new XMLWriter;
$xml->openURI('dealers_retail.xml');
$xml->setIndent(true);
$xml->startElement('DATA');

foreach($mergedArray as $item=>$data){
    $xml->startElement('ITEM');
    foreach($data as $index=>$value){
       $xml->writeElement($index, $value);
    }
   $xml->endElement();
}
$xml->endElement();

答案 1 :(得分:0)

这使用SimpleXML来创建文件,而不是尝试合并输出,这将在一个过程中读取经销商文件,从那里创建详细信息,然后读取库存文件并将详细信息添加到...

(已更新以将经销商读入一个数组,然后将详细信息一次性写入XML文件中。)

$data = fopen('dealers_retail.txt', 'r');
// Skip header
fgetcsv($data, 0, '|');

// Store dealer information
$dealers = [];
while ($line = fgetcsv($data, 0, '|')) {
    $dealers [$line[0]] = $line;
}
fclose($data);

$xml = simplexml_load_string("<Data />");

$data = fopen('inventory_retail.txt', 'r');
fgetcsv($data, 0, '|');

$dealerData = ['FRANCHISE_ID' => 0, 'FRANCHISE_NAME' => 1,
    'FRANCHISE_ADDRESS' => 2, 'FRANCHISE_CITY' => 3,
    'FRANCHISE_STATE' => 4, 'FRANCHISE_ZIP' => 5
];

// You will need to add all of the fields in here, this is just to show
// how to start.  Don't add the fields with a fixed value, these are added
// in separately
$itemData = ['VEHICLE_VIN' => 1, 'LISTING_ID' => 1,
    'LIST_PRICE' => 2, 'VEHICLE_YEAR' => 3,
    'MAKE_DESC' => 4, 'MODEL_DESC' => 5
];
while ($line = fgetcsv($data, 0, '|')) {
    // Add in dealer data
    $item = $xml->addChild("ITEM");
    $dealer = $dealers[$line[0]];
    foreach ( $dealerData as $name => $itemElement )   {
        $item->addChild($name, str_replace("~", "", $dealer[$itemElement]));
    }
    // Copy the data from the vehicle file to the XML
    foreach ( $itemData as $name => $itemElement )   {
        $item->addChild($name, str_replace("~", "", $line[$itemElement]));
    }

    // Add in fixed data - again finish this part off
    $item->addChild('CONDITION_RADIO', 'used');
    $item->addChild('ADF_CONDITION', 'used');
}
$xml->asXML('inventory_retail.xml');

产生

<?xml version="1.0"?>
<Data>
    <ITEM>
        <FRANCHISE_ID>12345</FRANCHISE_ID>
        <FRANCHISE_NAME>Mercedes-Benz of XXX</FRANCHISE_NAME>
        <FRANCHISE_ADDRESS>2915 Some Street</FRANCHISE_ADDRESS>
        <FRANCHISE_CITY>Oakland</FRANCHISE_CITY>
        <FRANCHISE_STATE>CA</FRANCHISE_STATE>
        <FRANCHISE_ZIP>94611</FRANCHISE_ZIP>
        <VEHICLE_VIN>12345678901234567</VEHICLE_VIN>
        <LISTING_ID>12345678901234567</LISTING_ID>
        <LIST_PRICE>47986</LIST_PRICE>
        <VEHICLE_YEAR>2019</VEHICLE_YEAR>
        <MAKE_DESC>Mercedes-Benz</MAKE_DESC>
        <MODEL_DESC>E-Class</MODEL_DESC>
        <CONDITION_RADIO>used</CONDITION_RADIO>
        <ADF_CONDITION>used</ADF_CONDITION>
    </ITEM>
    <ITEM>
        <FRANCHISE_ID>12345</FRANCHISE_ID>
        <FRANCHISE_NAME>Mercedes-Benz of XXX</FRANCHISE_NAME>
        <FRANCHISE_ADDRESS>2915 Some Street</FRANCHISE_ADDRESS>
        <FRANCHISE_CITY>Oakland</FRANCHISE_CITY>
        <FRANCHISE_STATE>CA</FRANCHISE_STATE>
        <FRANCHISE_ZIP>94611</FRANCHISE_ZIP>
        <VEHICLE_VIN>12345678901234568</VEHICLE_VIN>
        <LISTING_ID>12345678901234568</LISTING_ID>
        <LIST_PRICE>47986</LIST_PRICE>
        <VEHICLE_YEAR>2019</VEHICLE_YEAR>
        <MAKE_DESC>Mercedes-Benz</MAKE_DESC>
        <MODEL_DESC>E-Class</MODEL_DESC>
        <CONDITION_RADIO>used</CONDITION_RADIO>
        <ADF_CONDITION>used</ADF_CONDITION>
    </ITEM>
</Data>

答案 2 :(得分:0)

我建议先将CSV文件导入数据库。如果您没有数据库服务器,请使用SQLite。您也许可以为此使用某些CLI工具。在PHP脚本中,您可以收集多个数据项并立即插入它们,以归档内存和CPU使用率之间的平衡。

拥有数据库之后,您可以轻松地使用JOIN获取汇总结果并使用XMLWriter输出XML。

此外,您还可以生成过滤的或有限的结果。