I wrote a useful piece of code during the recent Shakerag workshop that makes it easy to save and load parameter data from text files. To celebrate the recent launch of the new Processing Wiki I have added it there, but for completeness I will also post it here.

Code: Data.pde

Use Data.beginSave() to initialize data string collection, then add data with Data.add(). To write to file, use endSave(filename). I’ve included code for auto-incrementing filenames, it’s used in the example code.

To load data, call Data.load(filename), then use readInt(), readFloat(), readString() etc. to get values from the strings read from the text file. Used properly this should give you most of the flexibility you need for simple data saving.

// saveData.pde
// Marius Watz - http://workshop.evolutionzone.com

// Example showing how to use the Data utility
// class to save and load data from text files. 

float a=2.5,b=3.144;
int x=10,y=20;
boolean bool=true;
String s="This is a string.";

Data data;

void setup() {
  size(400,400);

  data=new Data();

  // SAVING
  data.beginSave();
  data.add(s);
  data.add(a);
  data.add(b);
  data.add(x);
  data.add(y);
  data.add(bool);
  data.endSave(
    data.getIncrementalFilename(
      sketchPath("save"+
        java.io.File.separator+
        "data ####.txt")));

  // LOADING
  data.load(sketchPath("save"+
    java.io.File.separator+
    "data 0000.txt"));

  s=data.readString();
  a=data.readFloat();
  b=data.readFloat();
  x=data.readInt();
  y=data.readInt();
  bool=data.readBoolean();
}

///////////////////////////
// DATA CLASS

class Data {
  ArrayList datalist;
  String filename,data[];
  int datalineId;

  // begin data saving
  void beginSave() {
    datalist=new ArrayList();
  }

  void add(String s) {
    datalist.add(s);
  }

  void add(float val) {
    datalist.add(""+val);
  }

  void add(int val) {
    datalist.add(""+val);
  }

  void add(boolean val) {
    datalist.add(""+val);
  }

  void endSave(String _filename) {
    filename=_filename;

    data=new String[datalist.size()];
    data=(String [])datalist.toArray(data);

    saveStrings(filename, data);
    println("Saved data to '"+filename+
      "', "+data.length+" lines.");
  }

  void load(String _filename) {
    filename=_filename;

    datalineId=0;
    data=loadStrings(filename);
    println("Loaded data from '"+filename+
      "', "+data.length+" lines.");
  }

  float readFloat() {
    return float(data[datalineId++]);
  }

  int readInt() {
    return int(data[datalineId++]);
  }

  boolean readBoolean() {
    return boolean(data[datalineId++]);
  }

  String readString() {
    return data[datalineId++];
  }

  // Utility function to auto-increment filenames
  // based on filename templates like "name-###.txt" 

  public String getIncrementalFilename(String templ) {
    String s="",prefix,suffix,padstr,numstr;
    int index=0,first,last,count;
    File f;
    boolean ok;

    first=templ.indexOf('#');
    last=templ.lastIndexOf('#');
    count=last-first+1;

    if( (first!=-1)&& (last-first>0)) {
      prefix=templ.substring(0, first);
      suffix=templ.substring(last+1);

      // Comment out if you want to use absolute paths
      // or if you're not using this inside PApplet
      if(sketchPath!=null) prefix=savePath(prefix);

      index=0;
      ok=false;

      do {
        padstr="";
        numstr=""+index;
        for(int i=0; i< count-numstr.length(); i++) padstr+="0";
        s=prefix+padstr+numstr+suffix;

        f=new File(s);
        ok=!f.exists();
        index++;

        // Provide a panic button. If index > 10000 chances are it's an
        // invalid filename.
        if(index>10000) ok=true;

      }
      while(!ok);

      // Panic button - comment out if you know what you're doing
      if(index> 10000) {
        println("getIncrementalFilename thinks there is a problem - "+
          "Is there  more than 10000 files already in the sequence "+
          " or is the filename invalid?");
        println("Returning "+prefix+"ERR"+suffix);
        return prefix+"ERR"+suffix;
      }
    }

    return s;
  }

}

No Comments »

Comment on this entry

You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">