所以我写了一个小脚本,它将文本文件作为输入,读取每一行并尝试将其验证为电子邮件。如果它通过,它会将该行写入一个新的(' clean')文件,如果它没有通过,它会删除空格并尝试再次验证它。现在,如果它通过这一次,它会将该行写入一个新文件,如果它失败,它将忽略该行。
事情就是这样,我的脚本可能会在输出文件中写入重复的电子邮件。在编写之前,我应该如何解决这个问题并检查输出文件中是否存在重复项?
以下是相关代码:
// 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
}
答案 0 :(得分:2)
创建一个实现writer
的类型,然后创建自定义WriteString
在WriteString
内打开存储电子邮件的文件,遍历每封电子邮件并保存新电子邮件。
答案 1 :(得分: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{
"duplicated@golang.org",
"abc@golang.org",
"stackoverflow@golang.org",
"duplicated@golang.org", // <- Duplicated!
}
for _, email := range emails {
if !emailExists(email) {
fmt.Println(email)
addEmail(email)
}
}
}
这是输出:
duplicated@golang.org
abc@golang.org
stackoverflow@golang.org
您可以在 The Go Playground 尝试相同的代码。