Home  >  Article  >  Backend Development  >  Put text files into slices then compare

Put text files into slices then compare

WBOY
WBOYforward
2024-02-06 11:06:10560browse

Put text files into slices then compare

Question content

I am writing a program to get usernames line by line in a .txt file and verify that the username is in it. Then I created a slice and converted the file to a string and appended it to the string slice. I'm now trying to use a for loop to iterate through the slice to find the username in the file and compare it to another string variable containing the username. I want to check if it is in the slice. What's the best way to do this? I tried using a sliced ​​for loop to compare the elements in the range to the variable for the username I wanted to check, but it didn't work. So, in other words, I want to figure out the best way to get a txt file containing a list of usernames added from top to bottom, have my program read (loop) from that text file, and put it Compares a predetermined item (username) in a string variable to the contents of a text file and determines whether it matches.

Username (string variable) == username (in text file)

*The username variable will also be based on what the program user enters. So I'm trying to ultimately check if when the user enters their username the program will verify if it is in the file. Thanks.

Code examples I tried:

var readSystemCtl []string
readSystemCtl = append(readSystemCtl, string(file))
for _, username := range of readSystemCtl {
    if username == input {
        //Continue program if true 
        break
    }else {
        //Do something else
    }
}

Note: string(file) is the text file I want to read; input is the string variable entered by the user for their username, which is predetermined in the program.


Correct answer


As a go programmer, I quickly translated your overall application requirements into go programs. Then I compared it with your code. I don't understand why you use go for linear search of slices. Why not use random access go maps?

Before comparing usernames for equality, trim spaces (strings.trimspace) and, to be case-insensitive, convert them to lowercase (strings.tolower).

users.go

package main

import (
    "bufio"
    "fmt"
    "io"
    "os"
    "strings"
)

func loadusers(r io.reader) (map[string]bool, error) {
    users := make(map[string]bool)
    scnr := bufio.newscanner(r)
    for scnr.scan() {
        user := strings.trimspace(scnr.text())
        if len(user) > 0 {
            user = strings.tolower(user)
            users[user] = true
        }
    }
    if err := scnr.err(); err != nil {
        return nil, err
    }
    return users, nil
}

func loadusersfile(name string) (map[string]bool, error) {
    f, err := os.open(name)
    if err != nil {
        return nil, err
    }
    defer f.close()
    users, err := loadusers(f)
    if err != nil {
        return nil, err
    }
    return users, nil
}

func isuser(users map[string]bool, user string) bool {
    user = strings.trimspace(user)
    user = strings.tolower(user)
    return users[user]
}

func main() {
    users, err := loadusersfile("users.txt")
    if err != nil {
        fmt.fprintln(os.stderr, err)
        os.exit(1)
    }

    scnr := bufio.newscanner(os.stdin)
    for scnr.scan() {
        user := scnr.text()
        fmt.print("user: ", user)
        if isuser(users, user) {
            fmt.println(" found")
        } else {
            fmt.println(" not found")
        }
    }
    if err := scnr.err(); err != nil {
        fmt.fprintln(os.stderr, err)
        os.exit(1)
    }
}
$ cat users.txt
username1
Username2
UserName3
$ go build users.go
$ ./users
User Name X
User: User Name X not found
username3
User: username3 found
$

The above is the detailed content of Put text files into slices then compare. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete