<span style="font-family:arial,sans-serif;font-size:13px">As part of my work, I frequently have to &#39;shape&#39; multi-dimensional datasets. This is reasonably easy to do in Racket and I&#39;m thinking about pulling together some of the functions I use into a library. Before I do this though, I was wondering if there is any similar work I can build upon, or perhaps use to guide me.</span><div style="font-family:arial,sans-serif;font-size:13px">

<br></div><div style="font-family:arial,sans-serif;font-size:13px">As an example of what I mean, I&#39;ll receive from a colleague a file like this:</div><div style="font-family:arial,sans-serif;font-size:13px"><br></div>

<div style="font-family:arial,sans-serif;font-size:13px">Date, Site, Total Alkalinity as CaCO3 (mg/L), Carbonate as CaCO3 (mg/L),</div><div style="font-family:arial,sans-serif;font-size:13px">1-Nov-12, BH1, 120, &lt;5<br>

</div><div style="font-family:arial,sans-serif;font-size:13px">1-Nov-12, BH2, 180, &lt;5</div><div style="font-family:arial,sans-serif;font-size:13px">1-Nov-12, BH3, 160, &lt;5</div><div style="font-family:arial,sans-serif;font-size:13px">

26-Oct-12, BH1, 150, &lt;1</div><div style="font-family:arial,sans-serif;font-size:13px">26-Oct-12, BH2, 165, 0</div><div style="font-family:arial,sans-serif;font-size:13px">26-Oct-12, BH3, 180, &lt;5</div><div style="font-family:arial,sans-serif;font-size:13px">

<br></div><div style="font-family:arial,sans-serif;font-size:13px">(This is a laboratory analysis of water sampled from bore holes).</div><div style="font-family:arial,sans-serif;font-size:13px"><br></div><div style="font-family:arial,sans-serif;font-size:13px">

This file is composed of two datasets (a set each of total alkalinity and carbonate), with shared dimensions of &#39;date&#39; and &#39;site&#39;. I&#39;ll often deal with files containing up to 80 datasets.</div><div style="font-family:arial,sans-serif;font-size:13px">

<br></div><div style="font-family:arial,sans-serif;font-size:13px">More often than not, all I&#39;ll need to do is &#39;shape&#39; these datasets into a format that can be pulled into a spreadsheet for further analysis/graphing. One example is:</div>

<div style="font-family:arial,sans-serif;font-size:13px"><br></div><div style="font-family:arial,sans-serif;font-size:13px">&quot;&quot;, Total Alkalinity as CaCO3 (mg/L), Carbonate as CaCO3 (mg/L)</div><div style="font-family:arial,sans-serif;font-size:13px">

BH1</div><div style="font-family:arial,sans-serif;font-size:13px">1-Nov-12, 120, &lt;5</div><div style="font-family:arial,sans-serif;font-size:13px">26-Oct-12, 150, &lt;1</div><div style="font-family:arial,sans-serif;font-size:13px">

BH2</div><div style="font-family:arial,sans-serif;font-size:13px">1-Nov-12, 180, &lt;5</div><div style="font-family:arial,sans-serif;font-size:13px">26-Oct-12, 165, 0</div><div style="font-family:arial,sans-serif;font-size:13px">

BH3</div><div style="font-family:arial,sans-serif;font-size:13px">1-Nov-12, 160, &lt;5</div><div style="font-family:arial,sans-serif;font-size:13px">26-Oct-12, 180, &lt;5</div><div style="font-family:arial,sans-serif;font-size:13px">

<br></div><div style="font-family:arial,sans-serif;font-size:13px">Another example:</div><div style="font-family:arial,sans-serif;font-size:13px"><br></div><div style="font-family:arial,sans-serif;font-size:13px">&quot;&quot;, BH1, BH2, BH3</div>

<div style="font-family:arial,sans-serif;font-size:13px">Total Alkalinity as CaCO3 (mg/L)<br></div><div style="font-family:arial,sans-serif;font-size:13px">1-Nov-12, 120, 180, 160</div><div style="font-family:arial,sans-serif;font-size:13px">

26-Oct-12, 150, 165, 180</div><div style="font-family:arial,sans-serif;font-size:13px">Carbonate as CaCO3 (mg/L)<br></div><div style="font-family:arial,sans-serif;font-size:13px">1-Nov-12, &lt;5, &lt;5, &lt;5</div><div style="font-family:arial,sans-serif;font-size:13px">

26-Oct-12, &lt;1, 0, &lt;5</div><div style="font-family:arial,sans-serif;font-size:13px"><br></div><div style="font-family:arial,sans-serif;font-size:13px">As you can see, the recursive nature of these reports makes them ideal for processing with Racket, and although it takes me a little while to get the format of a report right, I usually can add the report to my toolbox for whenever it&#39;s needed later.</div>

<div style="font-family:arial,sans-serif;font-size:13px"><br></div><div style="font-family:arial,sans-serif;font-size:13px">So I&#39;ve started drafting what I think a good DSL for doing this type of task might be, something like:</div>

<div style="font-family:arial,sans-serif;font-size:13px">(define-dataset</div><div style="font-family:arial,sans-serif;font-size:13px">  (date (date &#39;dd-MM-yyyy&#39;))</div><div style="font-family:arial,sans-serif;font-size:13px">

  (site (text))</div><div style="font-family:arial,sans-serif;font-size:13px">  (parameter (text)) ...)</div><div style="font-family:arial,sans-serif;font-size:13px"><br></div><div style="font-family:arial,sans-serif;font-size:13px">

(define-report example1</div><div style="font-family:arial,sans-serif;font-size:13px">  (columns (parameter ...))</div><div style="font-family:arial,sans-serif;font-size:13px">  (rows ((site) date)))</div><div style="font-family:arial,sans-serif;font-size:13px">

<br></div><div style="font-family:arial,sans-serif;font-size:13px">I haven&#39;t worked out the details yet, and I&#39;m not sure the above will work the way I want it to. But I&#39;ve had a quick look at Microsoft&#39;s Scientific DataSet (<a href="http://sds.codeplex.com/" target="_blank">http://sds.codeplex.com/</a>), but it lacks the composability I&#39;m used to with Racket. Is anyone aware of any similar work that does this, or that I could use as a guide?</div>

<div style="font-family:arial,sans-serif;font-size:13px"><br></div><div style="font-family:arial,sans-serif;font-size:13px">Thanks,</div><div style="font-family:arial,sans-serif;font-size:13px">Simon.</div>