Как я могу получить полезную информацию из самого большого файла с разделителями табуляции с помощью PHP? - PullRequest
0 голосов
/ 01 февраля 2012

У меня следующая проблема. У меня есть tabdelimited файл с более 100 000 записей. В каждой строке 6 и более элементов, но я хочу получить 2 элемента из любой строки.

Пример структуры файла с вкладками:

    a1  1       b1      c1      11      111
    a2  2       b2      c2      12      112
    a3  3       b3      c3      13      113
    a4  4       b4      c4      14      114
...........................................................................

Следующий код вернул все элементы из этого файла в массиве:

$f4 = fopen("FILE.TXT", 'r');
        while (($line = fgetcsv($f4, 0, "\t")) !== FALSE)
            if ($line)
                    $arr4[] = $line;
fclose($f4);

Этот код для более 100 000 строк очень и очень медленно. Как я могу получить необходимые элементы и алгоритм, чтобы быть быстрым?

Результат вывода:

Array
(
    [0] => Array
        (
            [0] => a1 //first column
            [1] => b1 //third column     
        )

    [1] => Array
        (
            [0] => a2
            [1] => b2
        )

    [2] => Array
        (
            [0] => a3
            [1] => b3    
        )

    [3] => Array
        (
            [0] => a4
            [1] => b4   
        )
)

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 01 февраля 2012

2 столбца из каждой строки

Если ваша цель состоит в том, чтобы получить 2 столбца из каждой строки, вам придется перебирать все строки. Лучше всего немедленно выполнить любые необходимые операции, а не сбрасывать строки в массив (так как это быстро израсходует память, если несколько пользователей смогут одновременно запустить этот скрипт).

Единственный способ сделать это намного быстрее - это кешировать результаты заранее. Вы можете загрузить CSV в таблицу базы данных и индексировать столбцы, например.

2 столбца из строки, соответствующей идентификатору

Вы можете сделать это довольно быстро, выполнив поиск по регулярному выражению, а не анализируя весь файл. Например, если вы поместите идентификатор в первый столбец, вы можете сделать что-то вроде этого:

// note that because we use file_get_contents, the file must fit in memory!
// if multiple users are hitting this at the same time, it could be a valid concern
preg_match("/^$sanitized_id/" file_get_contents('filename.csv'), $matches);
if( count($matches) > 1 ) {
   $row_values = explode("\t", $matches[1]);
   var_dump($row_values);
}
else {
   print "No matches";
}

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

1 голос
/ 01 февраля 2012

Если я правильно понимаю ваш вопрос, вы хотите получить 2 из произвольного числа столбцов из каждой строки в файле CSV. Для этого:

$f4 = fopen('FILE.TXT', 'r');
while (($line = fgetcsv($f4, 0, "\t")) !== FALSE) {
    $arr4[] = array(
        $line[2], // Use whatever indexes you need for the columns
        $line[3]  // here.
    );
}
fclose($f4);

При желании вы можете указать максимальную длину в качестве аргумента # 2 для fgetcsv(), чтобы немного ускорить процесс. См. здесь для получения дополнительной информации.

Редактировать: Кроме того, если ваши индексы столбцов последовательные (например, 2, 3 или 4, 5), использование array_slice () может быть быстрее, но вам придется сравните это, чтобы знать наверняка.

...