Есть ли способ упорядочить каталоги с помощью readdir () Джулии? - PullRequest
4 голосов
/ 06 августа 2020

У меня более тысячи файлов с именами LOGS_A1, LOGS_A2, LOGS_A3 , ..., LOGS_A16281`, и я хочу перечислить файлы в этом порядке

cwd = pwd()
ParentDir = joinpath(cwd,"LOGS_A")
dirs = readdir(ParentDir, join=true, sort=true)

Однако он упорядочивает записи в алфавитном порядке:

LOGS_A999
LOGS_A9990
LOGS_A9991
LOGS_A9992
LOGS_A9993
LOGS_A9994
LOGS_A9995
LOGS_A9996
LOGS_A9997
LOGS_A9998
LOGS_A9999

Есть ли способ отсортировать их, чтобы они отображались от 1 до 16281?

Ответы [ 2 ]

1 голос
/ 07 августа 2020

Для более простого и надежного ответа используйте NaturalSort.jl :

julia> using Pkg; pkg"add NaturalSort"
  Resolving package versions...
Updating `~/.julia/environments/v1.5/Project.toml`
  [c020b1a1] + NaturalSort v1.0.0
Updating `~/.julia/environments/v1.5/Manifest.toml`
  [c020b1a1] + NaturalSort v1.0.0

julia> using NaturalSort
[ Info: Precompiling NaturalSort [c020b1a1-e9b0-503a-9c33-f039bfc54a85]

julia> src = ["LOGS_A1","LOGS_A10","LOGS_A11","LOGS_A2","LOGS_A3","LOGS_A4",
              "LOGS_A5","LOGS_A6","LOGS_A7","LOGS_A8","LOGS_A9"];

julia> sort(src, lt=natural)
11-element Array{String,1}:
 "LOGS_A1"
 "LOGS_A2"
 "LOGS_A3"
 "LOGS_A4"
 "LOGS_A5"
 "LOGS_A6"
 "LOGS_A7"
 "LOGS_A8"
 "LOGS_A9"
 "LOGS_A10"
 "LOGS_A11"
0 голосов
/ 06 августа 2020

Это то, что вы хотите?

julia> src = ["LOGS_A1",
              "LOGS_A10",
              "LOGS_A11",
              "LOGS_A2",
              "LOGS_A3",
              "LOGS_A4",
              "LOGS_A5",
              "LOGS_A6",
              "LOGS_A7",
              "LOGS_A8",
              "LOGS_A9"];

julia> sort(src, by = x -> parse(Int, chop(x, head=6, tail=0)))
11-element Array{String,1}:
 "LOGS_A1"
 "LOGS_A2"
 "LOGS_A3"
 "LOGS_A4"
 "LOGS_A5"
 "LOGS_A6"
 "LOGS_A7"
 "LOGS_A8"
 "LOGS_A9"
 "LOGS_A10"
 "LOGS_A11"

Я использую chop, поскольку в данном случае это кажется самым простым, поскольку я понимаю, что у вас везде одинаковый префикс.

Альтернативой является :

julia> src[sortperm(parse.(Int, chop.(src, head=6, tail=0)))]
11-element Array{String,1}:
 "LOGS_A1"
 "LOGS_A2"
 "LOGS_A3"
 "LOGS_A4"
 "LOGS_A5"
 "LOGS_A6"
 "LOGS_A7"
 "LOGS_A8"
 "LOGS_A9"
 "LOGS_A10"
 "LOGS_A11"

что немного быстрее, но сложнее для записи (и, вероятно, в вашем случае скорость не имеет значения).

...