У меня есть еще один файл 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"; }} ?>
Любая помощь в кодировании приветствуется. Было бы неплохо также, чтобы поиск был нечувствительным к регистру. Спасибо за прочтение!
Вы близки. Что-то вроде этого должно работать:
$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"; } }
Что касается нечувствительности к регистру. Мне любопытно сделать эту работу amonst списком моих контактов с Outlook. Есть ли более эффективная функция, чем 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] для фильтрации.
Я не уверен, что если использовать регулярное выражение в строке строки и использовать функции поиска по массиву, это будет быстрее, поэтому, вероятно, стоит проверить.