2011-10-20 2 views
2

루비에 새로운, 나는 다음과 같은 상황이 있어요. 나는 새로운 라인으로 구분 된 값을 가진 파일을 가지고, 그들은 다음과 같이 :루비 간단한 대체

18917 
18927 
18929 
... 

내가 처음 2 개 문자를 잡고 다음, 그들 모두에 폴더 경로를 앞에 추가하고 싶은뿐만 아니라, 그 값을 그 앞에 추가

경로 /로/foler/18/18917.jpg

그래서 코드를했습니다이 루비 코드 : 그들은이처럼 보이는 끝낼 것이다 있도록 파일에 다음 마지막에 '.JPG'를 추가 :

자, 이제 거의 작동합니다. 작동하지 않는 부분은 처음 2 자의 움 직입니다. 나도 따옴표 밖에있는 메서드로 (물론 # {}없이) 시도했지만 빈 결과 만 산출합니다.

내 어리 석음을 지적 해주세요.

결국 이미지를 삭제하고 싶습니다만 위의 'puts'대신 'File.delete'를 사용하면 트릭을 수행 할 것입니다.

평상시처럼 이것을 보면서 시간을내어 미리 감사드립니다.

+0

이 당신은 확실히 '이미지 = lines.collect.to_s.gsub ("\ n을" , ".jpg,")'이 맞습니까? – Reactormonk

+0

이 코드를 시도했습니다. 그것은 당신이 기대했던대로 작동합니다. 문자열의 처음 두 문자가 jruby-1.6.2 : 007> images.split (',')로 반환됩니다. collect {| dogtag | [foo/18/18917.jpg ","foo/18/18927.jpg ","foo/18] "# {folder}/# {dogtag [0,2]}/# {dogtag}"} /18929.jpg "] –

+0

@ 이스 : 네. 나는 그것이 루비에서 무엇이든 확실하다는 것을 의미합니다. – kakubei

답변

4

collect의 기능을 이해하고있는 것으로 보이지 않습니다.

나는이 같이 당신의 조각을 다시 것 :

File.read("values.csv").each do |line| 
    puts "bad dog: /path/to/folder/#{line[0,2]}/#{line.chomp}.jpg" 
end 

- 마지막 코멘트 업데이트 : -

당신은 파일이 이전에 존재하는 경우 문을 확인하는 경우를 사용하지 않으려면 그것을 삭제하면 두 가지 옵션 (AFAIK)이 있습니다.

사용 rescue :

File.read("values.csv").each do |line| 
    begin 
    File.delete "/path/to/folder/#{line[0,2]}/#{line.chomp}.jpg" 
    rescue Errno::ENOENT 
    next 
    end 
end 

또는는 delete_if_exists 방법으로 File 클래스를 확장합니다. 당신은 당신의 스크립트의 상단에이를 넣을 수 있습니다 :이

class File 
    def self.delete_if_exists(f) 
    if exists?(f) 
     delete(f) 
    end 
    end 
end 

, 당신이 할 수 있습니다

File.read("values.csv").each do |line| 
    File.delete_if_exists "/path/to/folder/#{line[0,2]}/#{line.chomp}.jpg" 
end 
+0

좋은 직장 @ 미샤. –

+0

나는 정말 루비에 익숙하지 않기 때문에 내가 본 방식대로 갈 것이므로, 추악한 코드가 생길 것이다. 당신이 준 코드는 거의 작동하지만, 모든 항목 이후에 기존의 \ n 때문에 새로운 줄에 '.jpg'을 출력합니다. 'bad dog :/path/to/folder/30/30427 .jpg' 그래서 줄 바꿈 문자를 제거해야 할 필요가 있습니다. puts 위의'line = line.gsub ("\ n", ".jpg")'을 추가하여 트릭을 만들었습니다. 감사합니다. – kakubei

+0

@ kakubei : 오, 죄송합니다.내가 고칠 수있게 해줘. 아. 너는'gsub'을 사용하여 그것을 고쳤다 고 생각한다.'chomp'도 고려할 수있다. 내 수정 된 답변을 참조하십시오. – Mischa