2011-09-21 129 views
1

我需要幫助才能從CSV文件生成類別樹。使用csv文件生成類別樹

我試過很多東西,但我迷路了......

我有800線,看起來像這樣的文件:

"LOADERS", "S130", "Above & 524611001, 524711001 & Above", "MAINTENANCE ITEMS", "SCHEDULED MAINTENANCE ITEMS (500 HOUR)" 
"LOADERS", "S130", "Above & 524611001, 524711001 & Above", "MAINTENANCE ITEMS", "SCHEDULED MAINTENANCE ITEMS (1000 HOUR)" 
"LOADERS", "S130", "Above & 524611001, 524711001 & Above", "MAIN FRAME", "OPERATOR CAB" 

在這些線路, 第1列表示父類 第2列是第1列的孩子 第3列是第2列的孩子 第3列是第4列的母親(但它是爆炸(',',第3列)) 第4列爆炸是5

我想生成這種類型的數組(和創建起始於50的ID),因爲我們的目標是將此文件轉換成MySQL數據庫:■

我會在有這樣的事情

成功
LOADERS (id = 50) 
|___S130 (id = 51) 
|----|____Above & 524611001 (id = 52) 
|-----------|____ MAINTENANCE ITEMS (id = 53) 
|------------------|____SCHEDULED MAINTENANCE ITEMS (500 HOUR) (id = 54) 
|------------------|____SCHEDULED MAINTENANCE ITEMS (1000 HOUR) (id = 55) 
|-----------|____ MAIN FRAME (id = 56) 
|------------------|____OPERATOR CAB (id = 57) 
|----|____Above & 524711001 (id = 58) 
|-----------|____ MAINTENANCE ITEMS (id = 59) 
|------------------|____SCHEDULED MAINTENANCE ITEMS (500 HOUR) (id = 60) 
|------------------|____SCHEDULED MAINTENANCE ITEMS (1000 HOUR) (id = 61) 
|-----------|____ MAIN FRAME (id = 62) 
|------------------|____OPERATOR CAB (id = 63) 

我試了一堆方法,我開始絕望。我所做的一切都沒有達到預期的結果:自從星期一開始,我就爲此付出了汗水,我想要自殺。

回答

1

嘗試這樣:

<?php 
// generate categories tree with csv file 
// http://stackoverflow.com/questions/7498119/generate-categories-tree-with-csv-file 

$big_array = array(); 
$temp_array = array(); 

$csv = <<< CSV 
"LOADERS", "S130", "Above & 524611001, 524711001 & Above", "MAINTENANCE ITEMS", "SCHEDULED MAINTENANCE ITEMS (500 HOUR)" 
"LOADERS", "S130", "Above & 524611001, 524711001 & Above", "MAINTENANCE ITEMS", "SCHEDULED MAINTENANCE ITEMS (1000 HOUR)" 
"LOADERS", "S130", "Above & 524611001, 524711001 & Above", "MAIN FRAME", "OPERATOR CAB" 
CSV; 

foreach(preg_split("/(\r?\n)/", $csv) as $line) { 

    list($column1, $column2, $column3, $column4) = explode('", "', $line); 

    $column1 = preg_replace('/^"/', '', $column1); 
    $column4 = preg_replace('/\"(?<!\\")/', '', $column4); 

    foreach(explode(', ', $column3) as $column3_part) { 
     $temp_array[$column3_part][] = $column4; 
    } 


    $big_array[$column1][$column2] = $temp_array; 
} 

echo '<pre>' . print_r($big_array, 1) . '</pre><hr />'; 

$counter = 50; 
foreach($big_array as $key1 => $level1) { 
    foreach($level1 as $key2 => $level2) { 
     foreach($level2 as $key3 => $level4) { 
      foreach($level4 as $level5) { 

       echo '<pre>' . print_r('INSERT INTO DATABASE: ' . $counter . ', ' . $key1 . ', ' . $key2 . ', ' . $key3 . ', ' . $level5, 1) . '</pre>'; 
       $counter++; 
      } 
     } 
    } 
} 
?> 
+0

結果非常有趣。但它缺乏最後一個孩子。探索停在「維護項目」和「主框架」上。它缺乏一個水平(:s)但這是一條很棒的賽道。 對我而言,我嘗試使用此功能直接讀取文件。我看到你用逗號代替了分號分隔,並且把CSV放入了一個var。 無論如何謝謝你的意見。 –

+0

我認爲有一個錯誤,因爲數組的一部分總是空的:s –

+0

我做了一個改變......它幾乎工作。一些元素相乘。這是我的代碼(抱歉格式化)。 $ big_array = array(); $ temp_array = array(); (($ data = fgetcsv($ handle,1000,「;」))if(($ handle = fopen(「arbocsv.csv」,「r」))!== FALSE) !== FALSE) { \t $ serial = preg_replace('/ /','',$ data [2]); \t \t $ serials = preg_replace('/&/','&',$ serials); \t \t $ serials = explode(',',$ serial); \t \t \t 的foreach \t($連續爲$串行) \t \t { \t \t \t $ temp_array [$串行] [$數據[3]] [] = $數據[4]; \t \t} \t \t \t $ \t big_array [$數據[0]] [$數據[1]] = $ temp_array; \t} } print_r($ big_array); –

0

非常感謝你再多艾曼。這裏是我的代碼,其中包含你給我的軌道。

$big_array = array(); 
$temp_array = array(); 

if (($handle = fopen("arbocsv.csv", "r")) !== FALSE) 
{ 
    while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) 
    { 

     $serials = preg_replace('/ /','',$data[2]); 
    $serials = preg_replace('/&/',' & ',$serials); 
    $serials = explode(',',$serials); 

    foreach($serials as $serial) 
    { 
     $temp_array[trim($serial)][trim($data[3])][] = trim($data[4]); 
    } 

    $big_array[trim($data[0])][trim($data[1])] = $temp_array; 


} 
}