CSV文件到具有物化路径的平面数组

时间:2012-01-18 16:20:48

标签: php

我有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
....

每一行取决于上面一行(深度参数)

我想创建一个像这样的数组,以便将它存储到我的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;             

}

但我不确定这是继续进行的最佳方式......

1 个答案:

答案 0 :(得分: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数组格式将其恢复。