簡體   English   中英

使用php通過單詞或文本過濾csv文件

[英]Filter a csv file by a word or text using 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”或“ guitar”過濾,我將得到第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";
    }
}

不區分大小寫的搜索呢? 我很好奇讓這項工作列入我的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]進行測試以進行過濾。

我不確定在行字符串上使用正則表達式與使用數組搜索功能相比是否更快,因此可能值得測試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM