2013年11月25日 星期一

Perl dump XML to Table or File-使用perl把XML資料轉換為表格或是檔案

一般而言所有坊間的書都在談論如何的將資料庫的資料轉為XML,而我所需要的功能竟是要轉XML去變成表格或檔案,在我的心中,最完美的資料就是原始資料,因為唯有原始資料才能打造任何的有用資訊。

1.使用XML::Parser或是XML::Simple
我用二者都可以,只要把檔案能夠讀進來就好,使用XML::Parser需注意,style要用tree,sub試了好久跟本都讀不到資料。

2.Data Stracture(讀進來之後的結構)
坊間所有的例子將完全不適合接下來的程序使用,因為所舉的例子太簡單了,只有二三個陣列,我手上資料庫轉出來的有大大小小10幾個陣列(Array),二三個雜湊(Hash),但是所要判斷的工作只有三種,字串(String)、陣列(Array)、雜湊(Hash),我用了一個很笨的方法判定字串(String)、陣列(Array)、雜湊(Hash),利用perl系統的錯誤!

$sahdependon = ($data)

if ($sahdependon =~ /ARRAY/ )
if ($sahdependon =~ /HASH/ )
ELSE ==string

----(看不懂的可能要加強一點程式能力,我的種式能力為中下,)--

只有陣列要往下打開,也就是寫一個Recursive 去做---------百分之一百錯誤!
因為用Recursive保證當,一份XML資料表(檔)沒有30K也有50K,雖然每次Recursive就會少掉大約7成的資料,相對的也複製出另一個7成的資料,也就是data量以(1.7)^n次方在增加,
我在windows都開不到3個檔就當, 在linux還有可多一點,但是也是做不完全部,我有16X以上的檔案,每星期以2~5個增加,其時是很驚人的。

我想到一個好方法來處理,把多維陣列拉成一維陣列,以下說明怎麼做:
例如:
$mainarray =
[$string0100,  $arraylevel0101=
                 [%hashlevel0200={$key,$value),
                   $string0201,
                    $arraylevel0202 = [ ........],
                   $string0203,
                    $arraylevel0204 = [ ........],
                   $string0205,
                    $arraylevel0206 = [ ........],
                   $string0207,
                    $arraylevel0208 = [ ........],
......]
---------------- 左左右右的一點規則都沒有 --------------------------
只有陣列要繼續打開
@parameter = @{$arraylevel0000};
foreach (@parameter) {
$_;
}

------------施主請不要用Recursive的想法-------------

3.拉成1維陣列

@array01 =  @{$mainarray[$point]};
 delete $mainarray[point];
foreach (@array01) {
splice @mainarray,$point,0,$_ ;
}

循環做就可以了!

結束點在$point > $arraycounter ;
$arraycounter = $#mainarray;

$#mainarray是指mainarray的個數
-----------------------------------------------------------

4.資料分列
XML的資料本來就是一個大Table中有Table,Table中又有Table,所以只要將Array的前一個String或是Hash加入一個"\n";就可以,施主可以隨緣加,各自隨喜勿庸自擾。

然後就完工了!
打完收工part 1 ,繼續part 2到18掌,才算美滿!
施主有幸隨緣遇喜下回再聊!







沒有留言: