質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

FileMaker

FileMaker(ファイルメーカー)は、ファイルメーカー社が開発しているデータベース構築ソフトウェアです。

Q&A

解決済

3回答

3315閲覧

フォルダー名の読み込み順番について

miyazawa_shi

総合スコア12

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

FileMaker

FileMaker(ファイルメーカー)は、ファイルメーカー社が開発しているデータベース構築ソフトウェアです。

0グッド

0クリップ

投稿2017/12/21 10:30

#概要
Rubyでフォルダー名を読み込む順番の規則性がわかりません。
実行環境と読み込むフォルダー名、Rubyのコードは以下です。

実行環境
OS : macOS High Sierra v10.13.2
Ruby : 2.4.1

#フォルダー名 (19個のフォルダー)
・Y2013_07 ・Y2013_10 ・Y2014_01 ・Y2014_04 ・Y2014_07 ・Y2014_10 ・Y2015_11
・Y2013_08 ・Y2013_11 ・Y2014_02 ・Y2014_05 ・Y2014_08 ・Y2014_11
・Y2013_09 ・Y2013_12 ・Y2014_03 ・Y2014_06 ・Y2014_09 ・Y2014_12

#実行コード
以下のコードを実行しています。
最初に読み込まれるのが「Y2014_09」となっており、理想として「Y2013_07」を一番最初に読み込みたいです。

Ruby:

1p Dir.glob(*) 2# => ["Y2014_09", "Y2014_07", "Y2013_10", "Y2013_11", "Y2014_06", "Y2014_01", "Y2014_08", "Y2014_12", "Y2014_04", "Y2014_03", "Y2014_02", "Y2014_05", "Y2013_12", "Y2014_11", "Y2013_08", "Y2013_09", "Y2014_10", "Y2013_07", "Y2015_11"]

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

Ruby 3.0からはDir.glob(*)はソート済みの結果を返すようになっています。

Dir.[] (Ruby 3.0.0 リファレンスマニュアル)

[PARAM] sort:

true ならワイルドカードや文字セット(鈎括弧)にマッチした結果をバイナリとして昇順にソートします。 false を指定するとソートせず2.7以前と同じ挙動になります。 true の場合でも、配列で指定した複数のパターンや波括弧での順番は保存されます。

いちおうご参考までに。

投稿2021/09/16 04:34

jnchito

総合スコア357

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ディレクトリエントリから取得されるファイルの順番は不定です。必要ならソートして下さい。

投稿2017/12/21 11:00

hichon

総合スコア5739

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

lsコマンドなどでファイルの一覧を表示するとソートされているのでそれが当たり前のように感じますが、大抵の言語の低水準I/Oライブラリーでは「ファイルがどの順番に取得できるかの保証はない」ように思います。それは**OSのシステムコールがそもそも順番を保証していない物理エントリー順で返す(※)**からだと思います。ソートの順番はアプリケーションによって様々なので逆に下手にソートされてしまうと速度が遅くなるだけであまり益がないという考え方ではないでしょうか。

※訂正:「保証しない」=>「物理エントリー順」に訂正させていただきました。
ご指摘ありがとうございました。>otnさん

ちなみにlsはシステムコールで返されたファイル名を自前でソートしているだけだと思います。

Rubyには暗いので実際にそのような便利なソート機能が何かのオプションにあるのかどうか自分は知らないのですが、例えばよく用いられるであろうdir.globなどは順番の保証がないといった記事を見かけました。
https://docs.ruby-lang.org/ja/latest/class/Dir.htmlを見てみたのですが順番について何も書いてないように見えました・・・)

ソートそのものは面倒という程でもないでしょうから、全ての一覧を取得した後にソートしてはいかがでしょうか?

投稿2017/12/21 10:59

編集2017/12/21 16:17
KSwordOfHaste

総合スコア18400

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hichon

2017/12/21 11:02

ls -f で実際に取得した順番で表示されます。
KSwordOfHaste

2017/12/21 11:18

なるほどmanにそう書いてありますね!意識したことがなかったです。 コメントありがとうございました。
otn

2017/12/21 15:39

回答者の方はご存じの上でぼやかしたと思いますが、順番の保証が無いのじゃなくて、物理エントリ順ですね。物理エントリ順であることは保証されていると思います。
KSwordOfHaste

2017/12/21 15:59

otnさん、コメントありがとうございます。 はっきり分かっていてコメントしたわけではありませんが、やはりそうなのですね。 利用者側からするとファイルを生成したり削除したあとで物理エントリー順がどうなるかを意識することは普通ないであろうという考えから、「保証がない」という表現でも実際上は問題ないと思っていましたが、ここは「保証がない」ではなく「物理エントリー順」と言うべきですね!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問