在Go中按数字顺序对文件进行排序

时间:2015-05-09 15:46:15

标签: file sorting for-loop go

我正在读一个目录,有了这个我注意到如果我有按编号(1,2,3,4 ......)排序的文件,那么它似乎使用了一些字母顺序。

假设我有13个文件(名为1.md,2.md,3.md ......),排序方式如下:1,10,11,12,13,2,3,4 .. 。我用来生成此订单的当前代码是:

CREATE TABLE Paises 
(
    Pais_Id numeric(18,0) PRIMARY KEY NOT NULL,
    Pais_Nombre varchar(255) NOT NULL
)

CREATE TABLE Cuentas 
(
    Cuenta_Nro numeric(18,0) PRIMARY KEY NOT NULL,
    Cuenta_Estado varchar(255),
    Cuenta_Moneda varchar(255) DEFAULT 'Dolar',
    Cuenta_Tipo numeric(18,0) 
       FOREIGN KEY REFERENCES Tipo_De_Cuentas(Tipo_De_Cuenta_Id),
    Cuenta_PaisOrigen numeric(18, 0) 
       FOREIGN KEY REFERENCES Paises(Pais_Id),
    Cuenta_PaisAsignado numeric(18, 0) 
       FOREIGN KEY REFERENCES Paises(Pais_Id),
    Cuenta_Fec_Cre datetime,
    Cuenta_Fec_Cierre datetime,
    Cuenta_Tarjeta numeric(18, 0) 
        FOREIGN KEY REFERENCES Tarjetas(Tarjeta_Nro),
    Cuenta_Cliente numeric(18, 0) 
        FOREIGN KEY REFERENCES Clientes(Cliente_Id)
)

CREATE TABLE #Cuentas_Con_RowNumer
(
    Cuenta_Nro numeric(18,0) PRIMARY KEY NOT NULL, 
    Cuenta_Estado varchar(255),
    Cuenta_PaisOrigen numeric(18,0)),
    Cuenta_Fec_Cre datetime, 
    Cuenta_Fec_Cierre datetime, 
    Cuenta_Cliente numeric(18,0), 
    Cuenta_Tarjeta numeric(18,0), 
    RowNumber int
)

INSERT INTO #Cuentas_Con_RowNumer
    SELECT *
    FROM (SELECT 
            Maestro.Cuenta_Numero, Maestro.Cuenta_Estado, Maestro.Cuenta_Pais_Codigo, 
            Maestro.Cuenta_Fecha_Creacion, Maestro.Cuenta_Fecha_Cierre, Clientes.Cliente_Id, Maestro.Tarjeta_Numero,
            ROW_NUMBER() OVER (PARTITION BY Maestro.Cuenta_Numero ORDER BY Maestro.Cuenta_Numero) AS RowNumber
        FROM gd_esquema.Maestra Maestro, dbo.Clientes
        WHERE 
        Clientes.Cliente_Apellido = Maestro.Cli_Apellido AND
        Clientes.Cliente_Nombre = Maestro.Cli_Nombre) AS a
    WHERE a.RowNumber = '1'


INSERT INTO Cuentas  
    (
        Cuenta_Nro, Cuenta_Estado, Cuenta_PaisOrigen, Cuenta_Fec_Cre, 
        Cuenta_Fec_Cierre, Cuenta_Cliente, Cuenta_Tarjeta
    )
    SELECT 
        Cuenta_Nro, Cuenta_Estado, Cuenta_PaisOrigen, Cuenta_Fec_Cre, 
        Cuenta_Fec_Cierre, Cuenta_Cliente, Cuenta_Tarjeta
    FROM #Cuentas_Con_RowNumer

我要找的顺序是1,2,3,... 9,10,11,12,13。

如何对这些文件进行严格的数字排序?请记住,每个文件都名为N.md,其中N保证是大于或等于0的整数。

谢谢。

1 个答案:

答案 0 :(得分:9)

您可以根据自己的要求实施sort界面和订单吗?给定返回的os.FileInfo元素片段,您可以使用数字顺序而不是字典顺序排列它们。

type ByNumericalFilename []os.FileInfo

func (nf ByNumericalFilename) Len() int      { return len(nf) }
func (nf ByNumericalFilename) Swap(i, j int) { nf[i], nf[j] = nf[j], nf[i] }
func (nf ByNumericalFilename) Less(i, j int) bool {

    // Use path names
    pathA := nf[i].Name()
    pathB := nf[j].Name()

    // Grab integer value of each filename by parsing the string and slicing off
    // the extension
    a, err1 := strconv.ParseInt(pathA[0:strings.LastIndex(pathA, ".")], 10, 64)
    b, err2 := strconv.ParseInt(pathB[0:strings.LastIndex(pathB, ".")], 10, 64)

    // If any were not numbers sort lexographically
    if err1 != nil || err2 != nil {
        return pathA < pathB
    }

    // Which integer is smaller?
    return a < b
}

files, _ := ioutil.ReadDir(".")

sort.Sort(ByNumericalFilename(files))

for _, f := range files {
    fmt.Println(f.Name())
}

我知道它不是很简洁,但却是一个有效的答案。