Как извлечь структурированные данные из дампа CSV в php - PullRequest
0 голосов
/ 06 июня 2011

Я экспериментирую с загрузкой CSV в PHP.

У меня есть CSV-файл с 3 столбцами, простые значения.

Мне удалось выполнить цикл по каждой строке и вывести каждое значение, но мне нужно получить данные, условно основанные на уникальных значениях и определенной позиции в строке.

Например, для каждого уникального значения в столбце a мне нужно сгенерировать массив объектов данных на основе значения столбца b, используя столбец c в качестве условия для одного из значений.

Мой CSV:

1   123 0
1   124 0
1   125 0
1   126 0
1   127 0
1   128 0
1   129 0
1   130 1
1   131 1
1   132 1
1   133 1
1   134 1
1   135 1
2   123 0
2   124 0
2   125 0
2   126 1
2   127 1
2   128 1
2   129 1
2   130 1
2   131 1
2   132 1
2   133 1
2   134 1
2   135 1
3   256 0
3   456 0
3   321 0
3   489 0
3   965 0
3   652 1
3   741 1

Код, который я использую для опроса:

<?php
$stack = array();
if (($han = fopen("sample.csv", "r")) !== FALSE) {
    while (($data = fgetcsv($han, 50, ",")) !== FALSE) {
        array_push($stack, $data); //push each arr1 into arr2(stack)
    }
    fclose($han);
}
sort($stack); //sort arr2
$newarray = array();
foreach($stack as $val){
$lineid = $val[0];
$segmentid = $val[1];
$action = $val[2];
$newarray[$lineid][$segmentid] = $action;
}
print_r($newarray);
?>

выход

Array
(
    [1] => Array
        (
            [123] => 0
            [124] => 0
            [125] => 0
            [126] => 0
            [127] => 0
            [128] => 0
            [129] => 0
            [130] => 1
            [131] => 1
            [132] => 1
            [133] => 1
            [134] => 1
            [135] => 1
        )

    [2] => Array
        (
            [123] => 0
            [124] => 0
            [125] => 0
            [126] => 1
            [127] => 1
            [128] => 1
            [129] => 1
            [130] => 1
            [131] => 1
            [132] => 1
            [133] => 1
            [134] => 1
            [135] => 1
        )

    [3] => Array
        (
            [256] => 0
            [321] => 0
            [456] => 0
            [489] => 0
            [652] => 1
            [741] => 1
            [965] => 0
        )

)

psuedocode для того, чего я хочу достичь

for each unique column_a value {
grab all column_b's within this unique column_a and for each
    $column_b_object = new stdClass;
    $column_b_object->id = $column_b_value;
      if (column_c_value = "0") {
        $column_b_object->zero = "no";
      }
    $column_bs[] = $column_b_object;
    execute something, reset, move to next unique column_a
}

РЕДАКТИРОВАТЬ РЕШЕНИЕ:

<?php
$stack = array();
if (($han = fopen("sample.csv", "r")) !== FALSE) {
while (($data = fgetcsv($han, 50, ",")) !== FALSE) {
array_push($stack, $data); //push each arr1 into arr2(stack)
}
fclose($han);
}
sort($stack); //sort arr2
$newarray = array();
foreach($stack as $val){
$lineid = $val[0]; $segmentid = $val[1]; $action = $val[2];
$newarray[$lineid][$segmentid] = $action;
}
foreach($newarray as $value) {
foreach($value as $key => $value2){
echo $key . " | " . $value2 . "<br />";
}
echo "STOP";
}
?>

Надеюсь, что это имеет смысл.

Спасибо

1 Ответ

1 голос
/ 06 июня 2011

Что-то не так с вашей логикой цикла.Если вы все еще собираетесь проходить через каждый элемент «b», почему вы должны определить уникальность вашего элемента «a»?В любом случае, может быть, это только я, но если вы все еще хотите сделать так, как ваш псевдо, вы можете: 1. Преобразовать строку из вашего CSV в массив1 2. Сохранить этот массив1 в другой массив2 3. Сортировать arraty2 4. Цикл по массиву2и отслеживайте любые изменения в первом элементе (элементе a)

$i=0;
$stack = array();
if (($han = fopen("3col.csv", "r")) !== FALSE) {
    while (($data = fgetcsv($han, 50, ",")) !== FALSE) {
        array_push($stack, $data); //push each arr1 into arr2(stack)
        $i++;
        $num = count($data);
        echo "<p>";
        for ($c=0; $c < $num; $c++) {
            echo $data[$c] . "|";
        }
        echo "</p>";
    }
    fclose($han);
}

sort($stack); //sort arr2

foreach($stack as $key => $arr2){
    $sameA = ($arr2[0] == $a) ? "" : "-->";
        echo $sameA;

    foreach($arr2 as $key => $val){ 
        echo $val." ";
    }
        $a = $arr2[0];
        echo "<br/>";
}

и выводе:

-->1 | 123 | 0 | 
1 | 124 | 0 | 
1 | 125 | 0 | 
1 | 126 | 0 | 
1 | 127 | 0 | 
1 | 128 | 0 | 
1 | 129 | 0 | 
1 | 130 | 1 | 
1 | 131 | 1 | 
1 | 132 | 1 | 
1 | 133 | 1 | 
1 | 134 | 1 | 
1 | 135 | 1 | 
-->2 | 123 | 0 | 
2 | 124 | 0 | 
2 | 125 | 0 | 
2 | 126 | 1 | 
2 | 127 | 1 | 
2 | 128 | 1 | 
2 | 129 | 1 | 
2 | 130 | 1 | 
2 | 131 | 1 | 
2 | 132 | 1 | 
2 | 133 | 1 | 
2 | 134 | 1 | 
2 | 135 | 1 | 
-->3 | 256 | 0 | 
3 | 321 | 0 | 
3 | 456 | 0 | 
3 | 489 | 0 | 
3 | 652 | 1 | 
3 | 741 | 1 | 
3 | 965 | 0 | 

Стрелку можно видеть каждый раз, когда вы запускаете новый элемент «a»

...