Фильтруйте CSV-файл по слову или тексту, используя php

У меня есть другой 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 ответа

Решение

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

$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";
    }
}

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

Здесь, вероятно, стоит отметить, что 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] для фильтрации.

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

Другие вопросы по тегам