Forum: Ruby Boolean question. File here but not there.

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
B58c6eef325656d513d26e2c3ae6bfd9?d=identicon&s=25 Peter Bailey (peterbailey)
on 2007-07-24 15:09
Hi,
I'm tryiing to determine that, for every TIFF file I have, is there a
corresponding PDF file, and, if there isn't, then, notate that in the
log. If there is a PDF file, then, don't log it. So, the resulting log
should show me a bunch of PDF files that I'll need to create, so that I
have a PDF for every TIFF I have. This script below seems to be listing
every single PDF file as not being there, even though the file's there.
Whew. Obviously, I must have something wrong with my Boolean logic. . .
.

Thanks,
Peter


...
list.each do |tifdir|
 pdfdir = tifdir
 Dir.chdir("L:/tiff/cdtiff/#{tifdir}")
 Dir.glob("*.tif").each do |tiffile|
   pdffile = File.basename(tiffile, ".tif") + ".pdf"
   tifthere   = File.exists?("L:/tiff/cdtiff/#{tifdir}/#{tiffile}")
   pdfnotthere  = !File.exists?("L:/pdf/single/#{pdfdir}/#{pdffile}")
   if tifthere && pdfnotthere
    File.open("E:/logs/pdfnotthere.txt", "a") { |f| f.print
"#{pdfdir}/#{pdffile} not there\n" }
   end
 end
end
1c0cd550766a3ee3e4a9c495926e4603?d=identicon&s=25 John Joyce (Guest)
on 2007-07-26 00:45
(Received via mailing list)
On Jul 24, 2007, at 8:09 AM, Peter Bailey wrote:

> Whew. Obviously, I must have something wrong with my Boolean
>  Dir.chdir("L:/tiff/cdtiff/#{tifdir}")
> --
> Posted via http://www.ruby-forum.com/.
>
Try using two Dir.globs
one for an array of  tiffs and one for an array of pdfs
then use Array#include? to compare one array's elements to the other
array by basename only.
create an array of matches or an array of non matches or both
use Array.collect to create the new array of pairs.
While you do that delete them from the previous arrays.
Output the 3 arrays and you have your pairs and non pairs.
6d9bf78ca49a017e9e3e6b0357b6c59e?d=identicon&s=25 Peter Hickman (Guest)
on 2007-07-26 00:45
(Received via mailing list)
Peter Bailey wrote:
> Thanks,
>
What is this line for? The only reason that tiffile has a value is that
the Dir.glob("*.tif") returned a filename proving the existence of the
tif file, Dir.glob() is not going to return the names of non existent
files or are you expecting the file to disappear? If so you have other
problems.

Also if pdfdir is a copy of tifdir you should probably just find a
better name for the variable and simplify some more. There is quite a
bit of superfluous code here and it will only serve to confuse you at a
later date when you come back to it and ask yourself "Why did I do
that?"

Try this simple rewrite:

list.each do |dir|
 Dir.chdir("L:/tiff/cdtiff/#{dir}")
 Dir.glob("*.tif").each do |tiffile|
   pdffile = File.basename(tiffile, ".tif") + ".pdf"
   pdfthere = File.exists?("L:/pdf/single/#{dir}/#{pdffile}")
   if ! pdfthere
    File.open("E:/logs/pdfnotthere.txt", "a") { |f| f.print
"#{dir}/#{pdffile} not there\n" }
   end
 end
end
B58c6eef325656d513d26e2c3ae6bfd9?d=identicon&s=25 Peter Bailey (peterbailey)
on 2007-07-26 14:21
Peter Hickman wrote:
> Peter Bailey wrote:
>> Thanks,
>>
> What is this line for? The only reason that tiffile has a value is that
> the Dir.glob("*.tif") returned a filename proving the existence of the
> tif file, Dir.glob() is not going to return the names of non existent
> files or are you expecting the file to disappear? If so you have other
> problems.
>
> Also if pdfdir is a copy of tifdir you should probably just find a
> better name for the variable and simplify some more. There is quite a
> bit of superfluous code here and it will only serve to confuse you at a
> later date when you come back to it and ask yourself "Why did I do
> that?"
>
> Try this simple rewrite:
>
> list.each do |dir|
>  Dir.chdir("L:/tiff/cdtiff/#{dir}")
>  Dir.glob("*.tif").each do |tiffile|
>    pdffile = File.basename(tiffile, ".tif") + ".pdf"
>    pdfthere = File.exists?("L:/pdf/single/#{dir}/#{pdffile}")
>    if ! pdfthere
>     File.open("E:/logs/pdfnotthere.txt", "a") { |f| f.print
> "#{dir}/#{pdffile} not there\n" }
>    end
>  end
> end

I don't know exactly what line you're referring to, Peter. But, your
suggestions are good ones. I like the "pdfthere" with the ! coming
later, instead of my "pdfnotthere." Thanks a lot for your help. I'm
playing with a combo of both yours and John's suggestions above.
B58c6eef325656d513d26e2c3ae6bfd9?d=identicon&s=25 Peter Bailey (peterbailey)
on 2007-07-26 14:23
John Joyce wrote:
> On Jul 24, 2007, at 8:09 AM, Peter Bailey wrote:
>
>> Whew. Obviously, I must have something wrong with my Boolean
>>  Dir.chdir("L:/tiff/cdtiff/#{tifdir}")
>> --
>> Posted via http://www.ruby-forum.com/.
>>
> Try using two Dir.globs
> one for an array of  tiffs and one for an array of pdfs
> then use Array#include? to compare one array's elements to the other
> array by basename only.
> create an array of matches or an array of non matches or both
> use Array.collect to create the new array of pairs.
> While you do that delete them from the previous arrays.
> Output the 3 arrays and you have your pairs and non pairs.

Thanks a lot. Yes, your suggestion in an intelligent one. My headspace
expands every day with Ruby! Thanks again.

-Peter
This topic is locked and can not be replied to.