Фильтровать CSV-файл по слову или тексту с помощью php - PullRequest
2 голосов
/ 04 марта 2010

У меня есть другой CSV-файл, где я пытаюсь сделать простой фильтр слов. Например, мой файл text.csv выглядит примерно так:

name, age, hobbies
Tom, 8, "football, soccer, baseball, wii, star wars, books"
Bill, 9, "football, baseball, ice hockey, basketball"
Sue, 8, "baseball, soccer, volleyball, bicycles, skating"
Mike, 8, "basketball, music, guitar, cartoons, books"
Ella, 9, "soccer, basketball, softball, clothes, books"
Tim, 9, "football, baseball, basketball, wii, cartoons"
Steven, 8, "baseball, soccer, star wars, cartoons, books"

Я бы хотел отфильтровать по третьему столбцу. Например, если я отфильтрую по «wii», я получу отправленные строки 1 и 6:

Tom, 8, "football, soccer, baseball, wii, star wars, books"
Tim, 9, "football, baseball, basketball, wii, cartoons"

Если я отфильтрую по "wii" или "гитаре", я получу отправленные строки 1, 4 и 6.

Tom, 8, "football, soccer, baseball, wii, star wars, books"
Mike, 8, "basketball, music, guitar, cartoons, books"
Tim, 9, "football, baseball, basketball, wii, cartoons"

Я плохо разбираюсь в php и массивах, но я пытался возиться с preg_match - но не уверен, что что-то вроде strpos лучше. Вот что я сделал, но не могу заставить его работать правильно:

<?PHP
$firstWord = 'wii';
$secondWord = 'guitar';
$file = fopen('text.csv', 'r');
while (($line = fgetcsv($file)) !== FALSE) 
{  
list($name[], $age[], $hobbies[]) = $line;
if (preg_match($firstWord, $hobbies[0]) || (preg_match($secondWord,     $hobbies[0]) {
echo $name . ',"' .$age . '",' .$hobbies . "<br> \n";
} else {
    echo "A match was not found.<br> \n";
}}
?>

Любая помощь в кодировании приветствуется. Также было бы неплохо, чтобы поиск не зависел от регистра. Спасибо за чтение!

Ответы [ 3 ]

6 голосов
/ 05 марта 2010

Ты рядом. Примерно так должно работать:

$file  = fopen('text.csv', 'r');

// You can use an array to store your search words, makes things more flexible.
// Supports any number of search words.
$words = array('wii', 'guitar');    
// Make the search words safe to use in regex (escapes special characters)
$words = array_map('preg_quote', $words);
// The argument becomes '/wii|guitar/i', which means 'wii or guitar, case-insensitive'
$regex = '/'.implode('|', $words).'/i';

while (($line = fgetcsv($file)) !== FALSE) {  
    list($name, $age, $hobbies) = $line;

    if(preg_match($regex, $hobbies)) {
        echo "$name, $age, $hobbies<br />\n";
    }
}
0 голосов
/ 05 марта 2010

Вероятно, здесь стоит отметить, что PHP имеет библиотеки обработки CSV.

http://php.net/manual/en/function.fgetcsv.php

Возвращает следующую строку CSV в виде массива, например

// csv file contains "col1,col2,col3"
// array = {'col1', 'col2', 'col3'}
$array = fgetcsv($csv);

Тогда вы можете просто использовать in_array () или тест для $ array [column_number] для фильтрации.

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

0 голосов
/ 05 марта 2010

А как насчет поиска без учета регистра? Мне любопытно сделать эту работу из списка моих перспективных контактов. Есть ли лучшая функция для использования, чем strtolower () ??

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...