gpt4 book ai didi

string - 使用 Golang 对文件名中带有数字的字符串进行排序

转载 作者:IT王子 更新时间:2023-10-29 00:46:59 40 4
gpt4 key购买 nike

我正在尝试将一些旧的 Python 代码转换为 Go 语言。但是我在对文件夹中的文件进行排序时遇到了困难。由于文件始终是 AMA1.txtAMA2.txt 等。在 python 源代码中我这样做了:

files=[]
for file in os.listdir(someDir):

if file.endswith(".txt"):
files.append(file)

convert = lambda text: int(text) if text.isdigit() else text
alphanum_key = lambda key: [ convert(c) for c in re.split('([0-9]+)',key) ]

files.sort( key=alphanum_key )

for i in files:
print (i)

到目前为止,我还没有进行排序:

func main() {
dirname := "someDir"
d, err := os.Open(dirname)

if err != nil {
fmt.Println(err)
}

defer d.Close()

fi, err := d.Readdir(-1)

if err != nil {
fmt.Println(err)
}

for _, fi := range fi {
if fi.Mode().IsRegular() {
fmt.Println(fi.Name())
}
}
}

最佳答案

Go 有一个 sort package .从具有非负整数后缀的名称构造可排序的名称。

例如,

package main

import (
"encoding/binary"
"fmt"
"os"
"path/filepath"
"sort"
"strconv"
)

// sortName returns a filename sort key with
// non-negative integer suffixes in numeric order.
// For example, amt, amt0, amt2, amt10, amt099, amt100, ...
func sortName(filename string) string {
ext := filepath.Ext(filename)
name := filename[:len(filename)-len(ext)]
// split numeric suffix
i := len(name) - 1
for ; i >= 0; i-- {
if '0' > name[i] || name[i] > '9' {
break
}
}
i++
// string numeric suffix to uint64 bytes
// empty string is zero, so integers are plus one
b64 := make([]byte, 64/8)
s64 := name[i:]
if len(s64) > 0 {
u64, err := strconv.ParseUint(s64, 10, 64)
if err == nil {
binary.BigEndian.PutUint64(b64, u64+1)
}
}
// prefix + numeric-suffix + ext
return name[:i] + string(b64) + ext
}

func main() {
dirname := "someDir"
d, err := os.Open(dirname)
if err != nil {
fmt.Println(err)
return
}
defer d.Close()
fi, err := d.Readdir(-1)
if err != nil {
fmt.Println(err)
return
}

fmt.Println("\nUnsorted:")
for _, fi := range fi {
if fi.Mode().IsRegular() {
fmt.Println(fi.Name())
}
}

sort.Slice(
fi,
func(i, j int) bool {
return sortName(fi[i].Name()) < sortName(fi[j].Name())
},
)

fmt.Println("\nSorted:")
for _, fi := range fi {
if fi.Mode().IsRegular() {
fmt.Println(fi.Name())
}
}
}

输出:

Unsorted:
amt099.txt
amt.txt
amt2.txt
amt100.txt
amt10.txt
amt1.txt

Sorted:
amt.txt
amt1.txt
amt2.txt
amt10.txt
amt099.txt
amt100.txt

关于string - 使用 Golang 对文件名中带有数字的字符串进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51359930/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com