Search code examples
f#fsharpchartfslab

Creating similar HTML reports for several data files


I need to analyze a dozen similarly formatted data files. I wish to generate a similar html report, containing some statistics and graphs which describe the data, for each file. One html report per one file, same graphs in each, just different numbers. For a single file, this is easy to do for instance using the FsLab journal. Despite my best efforts, I haven't found any way to do this efficiently for many similar files (same format, different numbers).

If I have 10 files, I'd need to copy-paste the journal 10 times and change the line that defines which file to load in each copy. Then whenever I wish to add a new graph I'd need to edit all 10 files. This clearly cannot be the best way to do this.

I am willing to use other methods than the journal and other libraries than FsLab if they suit the problem better, but I'd believe there'd be an easy solution for a basic thing like this.


Solution

  • This is something that is not very nicely supported by the FsLab Journals system, but you can definitely find some way to do this. One simple option I can think of would be to modify the build.fsx script for the journals so that it processes the script repeatedly and uses, e.g. environment variable to specify the input file.

    If you are using the standard template, look at the generateJournals functoion:

    let generateJournals ctx =
      let builtFiles = Journal.processJournals ctx
      traceImportant "All journals updated."
      Journal.getIndexJournal ctx builtFiles
    

    I think you should be able to modify it along the following lines:

    let generateJournals ctx =
      // Iterate over all inputs you want to process
      for input in inputFiles do
        // Set environment variable to keep 'input'
        let builtFiles = Journal.processJournals ctx
        // Move the resulting files, so that they do not 
        // get overwritten by the next run 
    
      // Just return the journal you want to open first below
      traceImportant "All journals updated."
      Journal.getIndexJournal ctx builtFiles
    

    Then in the journal, you should be able to use System.Environment to read the variable set in the build script.