2012-01-18 70 views
0

扁平陣列我有一個包含的文件和目錄的列表CSV文件:CSV文件與物化路徑

Depth;Directory; 
0;bin 
1;basename 
1;bash 
1;cat 
1;cgclassify 
1;cgcreate 
0;etc 
1;aliases 
1;audit 
2;auditd.conf 
2;audit.rules 
0;home 
.... 

每行依賴於上述的一個(深度PARAM)

我會喜歡以將其存儲到我的MongoDB collection with Materialized Paths

$directories = array(
    array('_id' => null, 
     'name' => "auditd.conf", 
     'path' => "etc,audit,auditd.conf"), 
    array(....) 
); 

我不知道如何處理...... 任何想法來創建這樣一個數組?

編輯1: 我沒有真正使用目錄 - 這是一個例子,所以我不能使用FileSystems函數或FileIterators。

編輯2: 從這個CSV文件,我可以創造一個JSON嵌套數組:

function nestedarray($row){ 
    list($id, $depth, $cmd) = $row; 

    $arr = &$tree_map; 

     while($depth--) { 
     end($arr); 
     $arr = &$arr [key($arr)]; 
    } 

    $arr [$cmd] = null;    

} 

但我不知道它是進行的最好方式......

+0

我第一次嘗試建立一個嵌套數組像{DIR1:[dir11:[file111,file112],dir12:[......]},然後應用一個遞歸函數,但我便無法成功在此方式 – Franquis 2012-01-18 16:33:20

+0

陣列已經扁平化..你的例子也非常具體。深度是否爲0,1,2,1?這會讓事情變得複雜。 – 2012-01-18 16:39:38

+0

是的,陣列變平了(我沒有編輯我的標題)。是的,深度可以走..更深:) – Franquis 2012-01-18 16:46:10

回答

1

這應該可以做到這一點,我認爲(至少在我的測試中,這與你的數據一起工作)。請注意,此代碼不會進行太多的錯誤檢查,並期望輸入數據按正確的順序(即從0級開始並且沒有漏洞)。

<?php 

$input = explode("\n",file_get_contents($argv[1])); 
array_shift($input); 

$data = array(); 
foreach($input as $dir) 
{ 
    if(count($parts = str_getcsv($dir, ';')) < 2) 
    { 
     continue; 
    } 

    if($parts[0] == 0) 
    { 
     $last = array('_id' => null, 
         'name' => $parts[1], 
         'path' => $parts[1]); 
     $levels = array($last); 
     $data[] = $last; 
    } 
    else 
    { 
     $last = array('id' => null, 
         'name' => $parts[1], 
         'path' => $levels[$parts[0] - 1]['path'] . ',' . $parts[1]); 
     $levels[$parts[0]] = $last; 
     $data[] = $last; 
    } 
} 

print_r($data); 

?> 
1

「最佳」方式是不以CSV格式存儲數據,因爲它是錯誤的工具。

這就是說,在這裏你去:

<?php 
$lines = file('/path/to/your/csv_file.csv'); 
$directories = array(); 
$path = array(); 
$lastDepth = NULL; 

foreach ($lines as $line) { 
    list($depth, $dir) = str_getcsv($line, ';'); 

    // Skip headers and such 
    if (!ctype_digit($depth)) { 
     continue; 
    } 

    if ($depth == $lastDepth) { 
     // If this depth is the same as the last, pop the last directory 
     // we added off the stack 
     array_pop($path); 
    } else if ($depth == 0) { 
     // At depth 0, reset the path 
     $path = array(); 
    } 

    // Push the current directory onto the path stack 
    $path[] = $dir; 

    $directories[] = array(
     '_id' => NULL, 
     'name' => $dir, 
     'path' => implode(',', $path) 
    ); 

    $lastDepth = $depth; 
} 

var_dump($directories); 

編輯:

對於它的價值,一旦你在PHP所需的嵌套結構,它可能會使用一個好主意json_encode(),serialize()或其他一些格式將其存儲到磁盤,並刪除CSV文件。然後,只要您再次需要它,您就可以使用json_decode()unserialize()將其恢復爲PHP數組格式。

+0

感謝您的回答,真的,但它沒有按預期工作:-( – Franquis 2012-01-19 09:44:03

+0

它是如何不按預期工作?如果你餵它輸入你的輸入問題,它提供了你說你想要的相同輸出。 – FtDRbwLXw6 2012-01-19 13:45:54