Как алфавитный файл CSV, используя Go? - PullRequest
0 голосов
/ 07 февраля 2020

Я пытаюсь упорядочить файл .csv с серией имен в алфавитном порядке, используя Go, исходя из фамилии, которая находится в первом столбце. Я искал по всему, но я не могу найти способ сделать это. Есть ли способ сделать это, удерживая другие значения в той же строке? У меня есть три 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 ret

Срез Person [] - это просто структура, которая содержит имя и фамилию.

1 Ответ

0 голосов
/ 08 февраля 2020
Пакет

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
}
...