Boolean question. File here but not there.

P

Peter Bailey

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. . .
 
J

John Joyce

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
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.
 
P

Peter Hickman

Peter said:
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}")

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
 
P

Peter Bailey

Peter said:
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.
 
P

Peter Bailey

John said:
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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
474,263
Messages
2,571,312
Members
47,987
Latest member
Gaurav

Latest Threads

Top