2016-08-06 15 views
0

Итак, я написал небольшой скрипт, который принимает текстовые файлы в качестве ввода, читает каждую строку и пытается проверить ее как электронную почту. Если он проходит, он записывает строку в новый («чистый») файл, если он не проходит, он разбивает его на пробелы и пытается снова проверить его. Теперь, если он пройдет это время, он записывает строку в новый файл, и если она терпит неудачу, она игнорирует строку.Способ проверки дубликатов перед записью в файл?

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

Вот соответствующий код:

// create reading and writing buffers 
    scanner := bufio.NewScanner(r) 
    writer := bufio.NewWriter(w) 

    for scanner.Scan() { 
     email := scanner.Text() 

     // validate each email 
     if !correctEmail.MatchString(email) { 
      // if validation didn't pass, strip and lowercase the email and store it 
      email = strings.Replace(email, " ", "", -1) 
      // validate the email again after cleaning 
      if !correctEmail.MatchString(email) { 
       // if validation didn't pass, ignore this email 
       continue 
      } else { 
       // if validation passed, write clean email into file 
       _, err = writer.WriteString(email + "\r\n") 
       if err != nil { 
        return err 
       } 
      } 

     } else { 
      // if validation passed, write the email into file 
      _, err = writer.WriteString(email + "\r\n") 
      if err != nil { 
       return err 
      } 
     } 

    } 

    err = writer.Flush() 
    if err != nil { 
     return err 
    } 

ответ

1

Вы можете использовать Go встроенную карту в виде набора, как это:

package main 

import (
    "fmt" 
) 

var emailSet map[string]bool = make(map[string]bool) 

func emailExists(email string) bool { 
    _, ok := emailSet[email] 
    return ok 
} 

func addEmail(email string) { 
    emailSet[email] = true 
} 

func main() { 
    emails := []string{ 
     "[email protected]", 
     "[email protected]", 
     "[email protected]", 
     "[email protected]", // <- Duplicated! 
    } 
    for _, email := range emails { 
     if !emailExists(email) { 
      fmt.Println(email) 
      addEmail(email) 
     } 
    } 
} 

Вот результат:

[email protected] 
[email protected] 
[email protected] 

Вы можете попробовать тот же код на The Go Playground.

+1

Это прекрасно. Я отредактировал свой код, чтобы включить ваше решение, и он элегантный и учу. Благодаря! – Arthmost

2

Создание типа, который реализует writer затем создать пользовательский WriteString

Внутри WriteString открыть файл, в котором вы храните ваши письма, итерацию по каждой электронной почте и сохранить новый электронные письма.

+0

Я не смог выполнить ваши инструкции, основываясь на том, что вы сказали. Другое решение, основанное на картах, работало. – Arthmost

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