Padding integers for use in filenames

If you’ve ever written code that generates a whole whack of files, you may have came across the following problem when processing them. Using a naming convention wherein files are numbered will  gum up any ordering which is based on string sorting (ls, for example). What you end up with is something like this:

results10.txt
results11.txt
results12.txt
results1.txt
results2.txt
...

Which is just no good, no good at all. A solution to this is to pad the file number with zeros, like so:

results0001.txt
results0002.txt
...
results0010.txt

I wrote a little function to make this easy:

pad_int<-function(n,scale){
  out_string<-paste(10*scale + n,sep='')
  out_string<-substr(out_string,2,nchar(out_string))
  return(out_string)
}

*EDIT: Very soon after posting this, ggplot creator and general rstats rockstar Hadley Wickham noted on twitter that you can do this in one line using:

sprintf(“%03d”, 1)

Then, simply pass this function your file number (n) and the number of zeros that you’d like to pad it with (scale). This should be the order of magnitude of the number of files you’re creating. For example:

for(i in 1:1000){
  padded<-pad_int(i,1000)
  file_name<-paste('results_',padded,'.txt',sep='')
  print(file_name)
}

This little bit of code came in quite handy in generating this video of dispersal on a discrete lattice. Enjoy!

7 thoughts on “Padding integers for use in filenames

  1. I also used this technique but had multiple sections to the video (and did voice over that required some timing). To keep the sections straight (and allow each section to be updated) I’d append a letter in front.
    So the first section was sprintf(“plots/a%03d.png”, i)
    second section was sprintf(“plots/b%03d.png”, i)

    (the “i” counter can continue or restart too)

    I ended up with 5 sections and I could independently rerun any of the sections if I wanted to tweak (or add frames) to that section. Made it so I didn’t have to recreate all the slides if I wanted to extend or modify a section.

    Output is here (with multiple sections):

  2. Is this how this section is supposed to work:

    pad_int<-function(n,scale){
    + out_string<-paste(10*scale + n,sep='')
    + out_string pad_int(87,3)
    [1] “17”

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s