2016-07-08 3 views
2

Я исхожу из фона PHP и пытаюсь создать небольшой инструмент, который позволит мне фильтровать список ключевых слов по черному списку, который предоставляется через CSV-файл. Мне удалось это сделать на PHP, но у него есть ограничение скорости. Поэтому я решил попробовать свои силы с Голаном. Мне удалось открыть CSV-файл fmt.Println содержание как ключевых слов, так и черного списка и удалось сравнить каждое из ключевых слов с каждым из ключевых слов blacklists. Но проблема, с которой я сталкиваюсь, заключается в том, что я могу понять, как построить динамический ассоциативный массив, что-то вроде этого.Сохранять данные, сгенерированные в вложенном цикле на карте или фрагменте

function compareKeywords($keyword, $filters) { 
     $matches = [];  
     foreach($filters as $filter) { 
      $matches[] = strpos($keyword, $filter); 
     }  
     $matches = array_filter($matches);  
     if(empty($matches)) { 
      return $keyword 
     } 
    } 

Эта функция просто проверяет ключевое слово в отношении полностью или частично сопоставляя в черный список ключевых слов, если он не соответствует черный список ключевых слов, он возвращает это ключевое слово, а затем добавляет его в CSV-файл.

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

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

func compare(keywords [][]string, filterKeywords [][]string) (keywordMap //no sure what type it should be) { 
    matchFilters := make(map[string]string) 
    keywordMap := make(map[string]string) 

    for _, keyword := range keywords { 
     for _, filter := range filterKeywords { 
      if convStr(keyword) == convStr(filter) { 
       // here i want to store matches filters 
      } 
     } 
    } 

    //Check if matchFilters empty and return filtered keywordMap 

    return 

} 

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

+0

Не могли бы вы указать пример строки из ключевых слов и фильтр csv-файла? Как вы собираетесь отображать ключевые слова для фильтров? – abhink

+0

У меня будет два файла. Список А, будет содержать 1 столбец Ключевое слово ------------------------ Ключевое слово 1 Ключевое слово 2 Thrase 1 Thrase 2 список B будет содержать ключевое слово с черным списком, а также с одним столбцом. Ключевые слова ----------------------------------- Ключевое слово Каждое ключевое слово из списка A будет проверяться против каждого ключевого слова из списка B. Который должен возвращать массив совпадающих значений. Результатом этого фильтра должен быть Thrase 1 из списка A.Поскольку нам нужно иметь строки со словом «Ключевое слово» и две строки с номером 2, единственное, что не соответствует, - это ключевое слово Thrase 1, которое должно быть возвращено. –

+0

Я могу использовать функции strings.Contain, чтобы определить, соответствуют ли ключевые слова из списка A ключевым словам из списка B, но я не понимаю, как их сохранить в форме ассоциативного массива. Чтобы позднее заполнить список C с отфильтрованными ключевыми словами ... –

ответ

0

Я не знаю PHP, но, насколько я понимаю из кода PHP эквивалент Go должен быть:

func compare(keyword string, filters map[string]struct{}) (string, error) { 
    // value, ok := myMap[key] 
    // this is Go syntax for checking the existance of a key in a map - check the ok variable. 
    _, filterMatched := filters[keyword] 
    if filterMatched { 
     return ``, fmt.Errorf("keyword %s got filtered", keyword) 
    } 

    return keyword, nil 
} 

Другими словами, вы могли бы просто использовать map типа, но имеющие вспомогательную функцию, очищает наше намерение хорошо.

0

Вот рабочий код с некоторыми оптимизациями, попробуйте его на The Go Playground:

package main 

import (
    "fmt" 
    "strings" 
) 

func main() { 
    filters := []string{"aaa", "bbb", "ccc"} 
    fmt.Println(compareKeywords("a", filters)) // "" 
    fmt.Println(compareKeywords("d", filters)) // "d" 
} 
func compareKeywords(keyword string, filters []string) string { 
    for _, filter := range filters { 
     if strings.Index(filter, keyword) >= 0 { 
      return "" 
     } 
    } 
    return keyword 
} 

выхода:

d 

И смотрите strings.Index Docs:

func Index(s, sep string) int 

Индекс возвращает индекс первого экземпляра sep в s или -1, если sep не присутствует в s.

Смежные вопросы