[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: изменение формата огромного количества данных
Bolik
привет,

у меня есть файл с такой структурой:


id1,val1,1
id2,val2,5
id2,val3,3
id3,val4,1


нужно преобразовать в такое:

id1,val1,,,,
id2,,,val3,,val5
id3,val4,,,,


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

написал такой код


<?php
define ('LINE_LENGTH', 10);
$file = fopen ('test.txt', "r");
$prev_id = "";
$arr = array();
while ($line = fgets ($file)) {
list($id, $hash, $pos) = explode (",", trim($line));
if ($prev_id == $id) {
$arr = fillLine($arr, $id, $pos, $hash);
$prev_id = $id;
} else {
if (!empty($arr)) {
printLine(LINE_LENGTH, $arr);
unset($arr);
$arr = array();
}
$arr = fillLine($arr, $id, $pos, $hash);
$prev_id = $id;
}
}


function fillLine ($arr, $id, $pos, $hash) {
$cnt = count ($arr);
for ($i=0; $i<=$cnt; $i++) {
if(empty($arr[$i][$pos])) {
$arr[$i]['id'] = $id;
$arr[$i][$pos] = $hash;
return $arr;
}
}
}


function printLine ($countPos, $arr) {
$file = fopen ('final.txt', "a");
foreach ($arr as $key) {
$string = $key['id'].",";
for ($i = 1; $i<=$countPos; $i++) {
if ($i==$countPos) {
$str = empty($key[$i]) ? "": $key[$i];
$string.=$str;
} else {
$str = empty($key[$i]) ? "," : $key[$i].",";
$string.=$str;
}
}

fwrite($file, $string.PHP_EOL);
}
fclose($file);
}


так все работает, но есть сомнения будет ли это работать на огромных объемах данных (десятки миллиардов строк). не нравится мне использование массива, количество повторяющихся id может быть и 100К, боюсь будет жрать слишком много памяти.

можно ли как-то упростить скрипт, чтоб увеличить производительность?

заранее спасибо за помощь!
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.