File question

J

Justin To

File name: some_random_report.2008-06-20.csv

I know which folder this file will be in, I just don't know what the
exact file name is. It should look similar to what I have above, except
everyday the date could be different. How would I search the folder for
the file? Also, I want my program to be able to open a new document
called "File name_extra.txt". How do I capture the File name into a
string, once I've figured out which file to open in the first place?

Thanks!!
 
M

Martin DeMello

File name: some_random_report.2008-06-20.csv

this should get you started

folder_name = "/path/to/folder"
reports = Dir["#{folder_name}/some_random_report*.csv"]

Dir[] uses file globbing, not regexp matching. If you want the latter,
try Dir["#{folder_name}/*.csv"].grep(/pattern/)

martin
 
B

Bryan JJ Buckley

Dir::glob is a bit more powerful than Dir::[], and it can take a
block, to which the filename gets passed. ri Dir::glob has pretty
comprehensive documentation on this.

Dir.glob("/path/to/files/*.*-*-*.csv") do |filename|
File.open("name_extra.txt", "w+") do |file|
file.puts filename
end
end

But if you need to mangle the filename, then, as Martin said, you can
run a regexp on the string once you have it.
 
J

Justin To

Thanks for the detailed explanation Bryan. I've figured out how to use
it now, but I'm still stuck on how to check for the latest file:

For instance,

some_file.2008-06-02.csv
some_file.2008-06-03.csv

Now I want to traverse the folder and open up the latter file. If it is
a viable solution, is there a command that returns the most recent file
with the name pattern "some_file.\d{4}-\d{2}-\d{2}.csv"

Thanks so much!
 
B

Bryan JJ Buckley

Hmm, well they're named nicely, so you can probably do something like

File.open(Dir['some_file.*.csv'].sort.last) do |f|
puts f.read # print out the contents of f
end

if you're confident that the dates in the names are accurate.
If you want to be more pedantic, you can check by the file's ctime
(which is when the directory's info for that file was changed) or
mtime (which is when the file itself was last changed.

latest = Dir['some_file.*.csv'].sort_by { |f| File.ctime(f) }.last

(Use Dir.glob instead if you need to). That's basically just sorting
the filenames based on the file's timestamp (ascending), and taking
the last one.

JJ
 

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

No members online now.

Forum statistics

Threads
474,202
Messages
2,571,057
Members
47,666
Latest member
selsetu

Latest Threads

Top