为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 Go 对 csv 文件进行字母排序?

如何使用 Go 对 csv 文件进行字母排序?

Go
宝慕林4294392 2022-05-17 17:56:19
我正在尝试使用 Go 根据姓氏(位于第一列)中按字母顺序排列具有一系列名称的 .csv 文件。我已经搜索了所有内容,但我似乎无法找到一种方法来做到这一点。有没有办法做到这一点,同时保持同一行中的其他值?我有三个同名的 .csv 文件,但我必须对它们进行洗牌才能完成我的任务(随机餐桌座位算法)。我希望能够将它们重新按定义的字母顺序排列,这样我就可以确定人们不会连续坐在一起。提前致谢。:)编辑:可能值得展示我用来洗牌的功能:func Shuffle(slice []Person) []Person {r := rand.New(rand.NewSource(time.Now().Unix()))ret := make([]Person, len(slice))n := len(slice)for i := 0; i < n; i++ {    randIndex := r.Intn(len(slice))    ret[i] = slice[randIndex]    slice = append(slice[:randIndex], slice[randIndex+1:]...)}return retPerson[] 切片只是一个包含名字和姓氏的结构。
查看完整描述

1 回答

?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

Go 的sort包附带了一个很好的例子。请参阅修改后的实现,该实现应该可以满足您的要求。


package main


import (

    "encoding/csv"

    "fmt"

    "io"

    "log"

    "sort"

    "strings"

)


// Unsorted sample data

var unsorted = `Balaam,Wileen,Saint Louis

Meachan,Lothaire,Lefengzhen

Scoggin,Ivonne,Pag

Hawarden,Audrye,Leiria

Claypool,Biddy,Maiorca

Stanford,Douglas,Báguanos

Petriello,Yvor,Obryte

Hatter,Margette,Luoping

Pepall,Linzy,Hucun

Carter,Kit,Parungjawa

`


type Person struct {

    Lastname  string

    Firstname string

    City      string

}


// Create a new Person record from a given string slice

func NewPerson(fields []string) (p Person, err error) {

    if len(fields) < 3 {

        return p, fmt.Errorf("not enough data for Person")

    }

    p.Lastname = fields[0]

    p.Firstname = fields[1]

    p.City = fields[2]

    return

}


// ByLastname implements sort.Interface for []Person based on the Lastname field.

type ByLastname []Person


func (a ByLastname) Len() int           { return len(a) }

func (a ByLastname) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }

func (a ByLastname) Less(i, j int) bool { return a[i].Lastname < a[j].Lastname }


func main() {

    // Open unsorted CSV from string

    r := csv.NewReader(strings.NewReader(unsorted))


    var people []Person


    for {

        // Read CSV line by line

        record, err := r.Read()

        if err == io.EOF {

            break

        }

        if err != nil {

            log.Fatal(err)

        }


        // Create Person from line in CSV

        person, err := NewPerson(record)

        if err != nil {

            continue

        }

        people = append(people, person)

    }


    // Sort CSV by Lastname

    sort.Sort(ByLastname(people))


    // Print to stdout

    for _, p := range people {

        fmt.Printf("%s %s from %s\n", p.Lastname, p.Firstname, p.City)

    }


    // Here you would write your CSV

}



查看完整回答
反对 回复 2022-05-17
  • 1 回答
  • 0 关注
  • 138 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号