訓練家的佈弱格-Patch1.2

The BLOG of trainer



編輯日期:2015-03-03 10:40

類型:網頁設計心得
作者:羽山
文章時間:2015-03-03 10:40:00
瀏覽人數:5621人
標題: XML 轉 CSV
網址:http://59-126-75-42.hinet-ip.hinet.net/blog/blog.php?id=1444
內容:
 

因日本輻射資料有 csv 、 xml 格式,先前已針對 csv 作了匯入工具,現在又拿到了一份

xml格式的資料,為了延續 csv 軟體的便利性,開發了一支簡單的 xml 轉 csv 工具。

假設 xml 內容如下:

 
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" lang="ja" xsi:noNamespaceSchemaLocation="standardizedXML_1.0.0_rc1.xsd">  
  3.   <projectId>1</projectId>  
  4.   <title>第1次走行サーベイによる空間線量率の測定結果(H23.6.6~H23.6.13)</title>  
  5.   <conductors>文部科学省</conductors>  
  6.   <sites>  
  7.     <site id="17_5539_3274_69">  
  8.       <meshID>5539_3274_69</meshID>  
  9.       <location>  
  10.         <geometry>  
  11.           <area>  
  12.             <coordinates>139.311250,36.980833 139.312500,36.980833 139.312500,36.980000 139.311250,36.980000 139.311250,36.980833</coordinates>  
  13.           </area>  
  14.         </geometry>  
  15.         <representativePoint>  
  16.           <latitude>36.980416</latitude>  
  17.           <longitude>139.311875</longitude>  
  18.           <latitude_60>36°58'49.5"</latitude_60>  
  19.           <longitude_60>139°18'42.8"</longitude_60>  
  20.           <distance unit="km">160.1</distance>  
  21.         </representativePoint>  
  22.         <cityCode>07364</cityCode>  
  23.         <prefecture>福島県</prefecture>  
  24.         <cityName>南会津郡桧枝岐村</cityName>  
  25.       </location>  
  26.       <occasion>  
  27.         <date>  
  28.           <date>2011-06-06</date>  
  29.           <timeZone>+09:00</timeZone>  
  30.         </date>  
  31.       </occasion>  
  32.       <representativeData>  
  33.         <doseMeasurements>  
  34.           <doseMeasurement>  
  35.             <doserates>  
  36.               <doserateInformation>  
  37.                 <doserate>  
  38.                   <data>  
  39.                     <unit>μSv/h</unit>  
  40.                     <statistics>  
  41.                       <n>2</n>  
  42.                       <mean>1.0E-01</mean>  
  43.                     </statistics>  
  44.                   </data>  
  45.                   <isEffectiveDose>false</isEffectiveDose>  
  46.                   <isEquivalentDose>false</isEquivalentDose>  
  47.                 </doserate>  
  48.               </doserateInformation>  
  49.             </doserates>  
  50.           </doseMeasurement>  
  51.         </doseMeasurements>  
  52.       </representativeData>  
  53.     </site>  
  54.     <site id="17_5539_3274_77">  
  55.       <meshID>5539_3274_77</meshID>  
  56.       <location>  
  57.         <geometry>  
  58.           <area>  
  59.             <coordinates>139.308750,36.981667 139.310000,36.981667 139.310000,36.980833 139.308750,36.980833 139.308750,36.981667</coordinates>  
  60.           </area>  
  61.         </geometry>  
  62.         <representativePoint>  
  63.           <latitude>36.981250</latitude>  
  64.           <longitude>139.309375</longitude>  
  65.           <latitude_60>36°58'52.5"</latitude_60>  
  66.           <longitude_60>139°18'33.8"</longitude_60>  
  67.           <distance unit="km">160.3</distance>  
  68.         </representativePoint>  
  69.         <cityCode>07364</cityCode>  
  70.         <prefecture>福島県</prefecture>  
  71.         <cityName>南会津郡桧枝岐村</cityName>  
  72.       </location>  
  73.       <occasion>  
  74.         <date>  
  75.           <date>2011-06-06</date>  
  76.           <timeZone>+09:00</timeZone>  
  77.         </date>  
  78.       </occasion>  
  79.       <representativeData>  
  80.         <doseMeasurements>  
  81.           <doseMeasurement>  
  82.             <doserates>  
  83.               <doserateInformation>  
  84.                 <doserate>  
  85.                   <data>  
  86.                     <unit>μSv/h</unit>  
  87.                     <statistics>  
  88.                       <n>2</n>  
  89.                       <mean>1.0E-01</mean>  
  90.                     </statistics>  
  91.                   </data>  
  92.                   <isEffectiveDose>false</isEffectiveDose>  
  93.                   <isEquivalentDose>false</isEquivalentDose>  
  94.                 </doserate>  
  95.               </doserateInformation>  
  96.             </doserates>  
  97.           </doseMeasurement>  
  98.         </doseMeasurements>  
  99.       </representativeData>  
  100.     </site>  

利用正歸表示式,找出所有 tag 使用次數,然後排序,找多最多重履性的tag

如 unit、n、timeZone、coordinates、lat....、lon、.....

將些這資料重新組成新的 csv column

於是就作出了一支小巧易用的小程式:

 
  1. <?php   
  2.   $program_name=basename(__FILE__);       
  3.   $HELP_MESSAGE="   
  4. XML to CSV.   
  5.   
  6. Example:   
  7.      
  8.   php {$program_name} [input xml file] [output csv file]   
  9.      
  10. ";      
  11.   if($argc!=3){   
  12.     echo $HELP_MESSAGE;   
  13.     exit();   
  14.   }     
  15.   $data = file_get_contents($argv[1]);   
  16.   $csv_output=$argv[2];     
  17.   $data = str_replace('"','”',$data);   
  18.   $data = str_replace(',',',',$data);     
  19.   preg_match_all('/<(.*)>(.*)<\/(.*)>/',$data,$all);   
  20.   //print_r($all[1]);   
  21.   $all_tags_counter = array_count_values ( $all[1] );         
  22.   //取得重覆最多次的數組,代表 csv 欄位     
  23.   $csv_columns_counter = array_count_values($all_tags_counter);   
  24.   arsort($csv_columns_counter);       
  25.   $base_c = key($csv_columns_counter);       
  26.   $header=ARRAY();   
  27.   $headers=ARRAY();   
  28.   foreach($all_tags_counter as $k=>$c){       
  29.     if($c == $base_c){   
  30.       //標題   
  31.       $title = str_replace(ARRAY('"',"'"),'',$k);   
  32.       array_push($header,$title);   
  33.       $k_start = $k;         
  34.       $mk = explode(" ",$k);   
  35.       $k_end = current($mk);   
  36.       $rules = '<'.$k_start.'>(.*)<\/'.$k_end.'>';   
  37.       preg_match_all('/<'.addslashes($k_start).'>(.*)<\/'.$k_end.'>/',$data,$headers[$k]);   
  38.     }   
  39.   }   
  40.   file_put_contents($csv_output,implode(',',$header)."\n");   
  41.   $tmp="";   
  42.   for($i=0;$i<$base_c;$i++){   
  43.     $d = ARRAY();   
  44.     foreach($header as $k){         
  45.       //內容   
  46.       $contents = $headers[$k][1][$i];   
  47.       array_push($d,$contents);   
  48.     }   
  49.     $tmp.=implode(",",$d)."\n";       
  50.     if($i%1000==0){   
  51.       file_put_contents($csv_output,$tmp,FILE_APPEND);   
  52.       $tmp="";   
  53.       echo "Process... {$i} /{$base_c} \n";   
  54.     }   
  55.   }   
  56.   if($tmp!=""){   
  57.     file_put_contents($csv_output,$tmp,FILE_APPEND);   
  58.     $tmp="";   
  59.     echo "Process... {$i} /{$base_c} \n";   
  60.   }   
  61.   file_put_contents($csv_output,trim(file_get_contents($csv_output)));     
  62.   echo "Done...\n";    

使用方式如下:

一個 70MB 的 xml ,約只要5秒鐘就可以轉成 csv 了

首頁  上十頁  上一頁  1 下一頁    最末頁 (總共有...1頁)

第 1 頁

有話要說  看留言 【0】
其他分類
當月訓練
(2015-03-27)
【驗證碼破解】7-11包裏驗證碼破解

(2015-03-26)
【驗證碼破解】郵局包裏驗證碼破解

(2015-03-28)
【追風 135】追風裝菜籃

(2015-03-31)
【網頁設計心得】360度球面照片轉平面全景

(2015-03-03)
【網頁設計心得】XML 轉 CSV

(2015-03-21)
【3WA日常】洗FZR化油器

最新訓練
(2024-11-04)
【酷龍 150】酷龍150 換新鏈條 里程:39250km

(2024-10-31)
【機車綜合相關】煞車檢測筆測量電阻範圍

(2024-10-29)
【機車綜合相關】拆胎特工-輪胎拆胎架

(2024-10-25)
【NSR 150】NSR150 更換前煞車油(簡易) 43177km

(2024-10-25)
【網誌】加密文章測試

(2024-10-19)
【本田 MSX-125】MSX-125 更換前輪軸承

(2024-10-18)
【HONDA CBR1000RR】CBR1000RR 側柱維修

(2024-10-15)
【KTM 390】KTM RC390 側柱增加 1.5cm

(2024-10-12)
【NSR 150】NSR150 更換空濾綿 43010km

(2024-10-10)
【NSR 150】NSR150 側柱加高1.5cm