2016-05-25 4 views
2

製品(最大10個の画像がある可能性があります)に2次画像を取得する必要がありますが、少し問題があります。問題があるのはsecondary_images/#{id}_20.jpgです。 _20は、_1_11_01_30のいずれかです。残念なことに、画像がシステムに入力されたとき、それらは命名規則と100%結束していませんでした。私は名前を変更したいが、50,000以上の画像がある。これを達成するための正しい方法は何でしょうか?Ruby - 特定のパラメータ内のファイル名の末尾を見つけよう

* secondary_images/#{id}の末尾が_20の場合、このコードは機能します。

def image_url(type = nil) 
    no_image = type.nil? ? 'no-image-lg.png' : 'no-image.png' 
    return "//img#{rand(0..9)}.foo.com/#{no_image}" unless has_image? 

    require 'net/http' 
    id = sprintf('%07d', master_product_id) 
    url = if type == 'secondaries' 
     "//img#{rand(0..9)}.foo.com/product_images/secondary_images/#{id}_20.jpg" 
     elsif type == 'thumbnail' 
     "//img#{rand(0..9)}.foo.com/product_images/thumbnails/#{id}.jpg" 
     else 
     "//img#{rand(0..9)}.foo.com/product_images/#{id}.jpg" 
     end 
    url = URI.parse(URI.encode(url.to_s)) 
    req = Net::HTTP.new(url.host, url.port) 
    res = req.request_head(url.path) 

    res.code == '200' ? url.to_s : "//img#{rand(0..9)}.foo.com/#{no_image}" 
    end 

    def images 
    images = {} 

    images['main'] = image_url 
    images['thumbnail'] = image_url 'thumbnail' 
    images['secondaries'] = image_url 'secondaries' 
    images.to_dot 
    end 

ありがとうございました!

+0

はいくつかのサンプル、ファイルの命名規則だけではなく説明を提供します。また、出力として何を得ることが期待されますか?私は "[ask]"と "[mcve]"を読むことをお勧めします。あなたのコードを実行可能にし、問題を実証する必要があります。あなたが尋ねていることを実証するのに必要な最低限に減らすことをお勧めします。 HTTP処理を表示することは役に立ちません。 –

+0

あなたはどんなサンプルを探していますか? '#{id} 'とは何でしょうか?実際には任意ですが、それは何でもかまいません。私が心配しているのは、 '_1'〜' _11'や '_01'〜' _30'のパラメータでフォルダを検索する方法です。私は他のすべてのコードを取り除くことができ、問題の行だけを含めることができますが、他のコードは役に立つかもしれません。 – skreebidedeep

+0

おそらく、ある種の正規表現がこのトリックを行うかもしれませんか? – skreebidedeep

答えて

0

これはあまりよくありませんが、次の正規表現を使用して対応する数字を照合することができます。ここで

/.*(([1-9])|(0[1-9])|([1-3]\d))\.jpg\b/ 

は例です:

https://regex101.com/r/gJ2jU7/1

+0

ありがとう!やってみます! – skreebidedeep

0

それはあなたが望むものを言うことは本当に難しいですが、おそらくそれは、Rubyがファイル名で取得することが簡単にルーチンが含まれていることを知るのに役立ちますパスで。いったんそれを持っていれば、それは文字列操作なので、名前の一部を抽出するのは簡単です。

def get_image_num(fname) 
    File.basename(fname, File.extname(fname)).split('_').last 
end 

[ 
    'secondary_images/foo_1.jpg', 
    'secondary_images/foo_11.jpg', 
    'secondary_images/foo_01.jpg', 
    'secondary_images/foo_30.jpg', 
    'secondary_images/foo_20.jpg' 
].map{ |s| 
    get_image_num(s) 
} 
# => ["1", "11", "01", "30", "20"] 

あなたがid値、およびファイル番号の両方を取得する必要がある場合は、私のような何かをしたい:

def get_image_num(fname) 
    File.basename(fname, File.extname(fname)).split('_') 
end 

[ 
    'secondary_images/123_1.jpg', 
    'secondary_images/123_11.jpg', 
    'secondary_images/123_01.jpg', 
    'secondary_images/123_30.jpg', 
    'secondary_images/123_20.jpg' 
].map{ |s| 
    get_image_num(s) 
} 
# => [["123", "1"], ["123", "11"], ["123", "01"], ["123", "30"], ["123", "20"]] 
+0

ありがとう、以前の仕事で '.basename'を見ていて、私が試していたものに役立つかもしれないと思っていました。私は明日仕事でこれを試してみます。 – skreebidedeep

関連する問題