Filter a csv file by a word or text using php
csv, filter, php, text
Solution
You're close. Something like this should work:
$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";
}
}
Problem
I have another csv file where I am trying to do a simple word filter. For example, my text.csv file looks something like this: ``` 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" ``` I would like to filter by the third column. For example, if I filter by "wii" I will get rows 1 and 6 sent back: ``` Tom, 8, "football, soccer, baseball, wii, star wars, books" Tim, 9, "football, baseball, basketball, wii, cartoons" ``` If I filter by "wii" or "guitar" I will get rows 1, 4, and 6 sent back. ``` Tom, 8, "football, soccer, baseball, wii, star wars, books" Mike, 8, "basketball, music, guitar, cartoons, books" Tim, 9, "football, baseball, basketball, wii, cartoons" ``` I'm not good at php and arrays, but I've tried messing around with preg_match - but not sure if something like strpos is better. Here's what I've done but can't get it to work right: ``` <?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"; }} ?> ``` Any coding help is appreciated. It would also be nice to have the search be case-insensitive. Thanks for reading!