]> Creatis software - CreaPhase.git/blobdiff - octave_packages/dataframe-0.9.1/@dataframe/display.m
Add a useful package (from Source forge) for octave
[CreaPhase.git] / octave_packages / dataframe-0.9.1 / @dataframe / display.m
diff --git a/octave_packages/dataframe-0.9.1/@dataframe/display.m b/octave_packages/dataframe-0.9.1/@dataframe/display.m
new file mode 100644 (file)
index 0000000..c2e98e3
--- /dev/null
@@ -0,0 +1,203 @@
+function resu = display(df)
+
+  %# function resu = display(df)
+  %# Tries to produce a nicely formatted output of a dataframe.
+
+  %% Copyright (C) 2009-2012 Pascal Dupuis <Pascal.Dupuis@uclouvain.be>
+  %%
+  %% This file is part of Octave.
+  %%
+  %% Octave is free software; you can redistribute it and/or
+  %% modify it under the terms of the GNU General Public
+  %% License as published by the Free Software Foundation;
+  %% either version 2, or (at your option) any later version.
+  %%
+  %% Octave is distributed in the hope that it will be useful,
+  %% but WITHOUT ANY WARRANTY; without even the implied
+  %% warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+  %% PURPOSE.  See the GNU General Public License for more
+  %% details.
+  %%
+  %% You should have received a copy of the GNU General Public
+  %% License along with Octave; see the file COPYING.  If not,
+  %% write to the Free Software Foundation, 51 Franklin Street -
+  %% Fifth Floor, Boston, MA 02110-1301, USA.
+  
+  %#
+  %# $Id: display.m 9585 2012-02-05 15:32:46Z cdemills $
+  %#
+
+  %# generate header name
+  dummy = inputname (1);
+  if (isempty(dummy))
+    dummy = "ans";
+  endif
+
+  if (2 == length (df._cnt))
+    head = sprintf ("%s = dataframe with %d rows and %d columns", \
+                    dummy, df._cnt);
+  else
+    head = sprintf ("%s = dataframe with %d rows and %d columns on %d pages", \
+                    dummy, df._cnt);
+  endif
+
+  if (!isempty (df._src))
+    for indi = (1:size (df._src, 1))
+      head = strvcat\
+          (head, [repmat("Src: ", size (df._src{indi, 1}, 1), 1)\
+                  df._src{indi, 1}]);
+    endfor
+  endif
+
+  if (!isempty (df._cmt))
+    for indi = (1:size(df._cmt, 1))
+      head = strvcat\
+          (head, [repmat("Comment: ", size (df._cmt{indi, 1}, 1), 1)\
+                  df._cmt{indi, 1}]);
+    endfor
+  endif
+  
+  if (all (df._cnt > 0))  %# stop for empty df
+    dummy=[]; vspace = repmat (' ', df._cnt(1), 1);
+    indi = 1; %# the real, unfolded index
+    %# loop over columns where the corresponding _data really exists
+    for indc = (1:min (df._cnt(2), size (df._data, 2))) 
+      %# emit column names and type
+      if (1 == length (df._rep{indc}))
+        dummy{1, 2+indi} = deblank (disp (df._name{2}{indc}));
+        dummy{2, 2+indi} = deblank (df._type{indc});
+      else
+        %# append a dot and the third-dimension index to column name
+        tmp_str = [deblank(disp (df._name{2}{indc})) "."];
+        tmp_str = arrayfun (@(x) horzcat (tmp_str, num2str(x)), ...
+                            (1:length (df._rep{indc})), 'UniformOutput', false); 
+        dummy{1, 2+indi} = tmp_str{1};
+        dummy{2, 2+indi} = deblank (df._type{indc});
+        for indk = (2:length (tmp_str))
+          dummy{1, 1+indi+indk} = tmp_str{indk};
+          dummy{2, 1+indi+indk} = dummy{2, 2+indi};
+        endfor
+      endif
+      %# "print" each column
+      switch df._type{indc}
+        case {'char'}
+          indk = 1; while (indk <= size (df._data{indc}, 2))
+            tmp_str = df._data{indc}(:, indk); %#get the whole column
+            indj = cellfun ('isprint', tmp_str, 'UniformOutput', false); 
+            indj = ~cellfun ('all', indj);
+            for indr = (1:length(indj))
+              if (indj(indr)),
+                if (isna (tmp_str{indr})),
+                  tmp_str{indr} = "NA";
+                else
+                  if (~ischar (tmp_str{indr}))
+                    tmp_str{indr} = char (tmp_str{indr});
+                  endif
+                  tmp_str{indr} = undo_string_escapes (tmp_str{indr});
+                endif
+              endif
+            endfor
+            %# keep the whole thing, and add a vertical space
+            dummy{3, 2+indi} = disp (char (tmp_str));
+            dummy{3, 2+indi} = horzcat...
+                (vspace, char (regexp (dummy{3, 2+indi}, '.*', ...
+                                       'match', 'dotexceptnewline')));
+            indi = indi + 1; indk = indk + 1;
+          endwhile
+        otherwise
+          %# keep only one horizontal space per line
+          unfolded = df._data{indc}(:, df._rep{indc});
+          indk = 1; while (indk <= size (unfolded, 2))
+            dummy{3, 2+indi} = disp (unfolded(:, indk));
+            tmp_str = char (regexp (dummy{3, 2+indi}, \
+                                    '[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?(\s??[-+]\s??[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?i)?', \
+                                    'match', 'dotexceptnewline'));
+            tmp_str = horzcat...
+                (vspace, char (regexp (dummy{3, 2+indi}, '\S.*', ...
+                                       'match', 'dotexceptnewline')));
+            dummy{3, 2+indi} = tmp_str;
+            indi = indi + 1; indk = indk + 1;
+          endwhile
+      endswitch
+    endfor
+
+    %# put everything together
+    vspace = [' '; ' '; vspace];
+    %# second line content
+    resu = []; 
+    if (!isempty (df._ridx))
+      for (ind1 = 1:size (df._ridx, 2))
+        if ((1 == size(df._ridx, 3)) && \
+              (any (!isna (df._ridx(1:df._cnt(1), ind1)))))
+          dummy{2, 1} = [sprintf("_%d", ind1) ; "Nr"];
+          dummy{3, 1} = disp (df._ridx(1:df._cnt(1), ind1)); 
+          indi = regexp (dummy{3, 1}, '\b.*\b', 'match', 'dotexceptnewline');
+          if (isempty (resu))
+            resu = strjust (char (dummy{2, 1}, indi), 'right');
+          else
+            resu = horzcat(resu, vspace, strjust (char (dummy{2, 1}, indi), \
+                                                  'right'), vspace);
+          endif
+        else 
+          for ind2 = (1:size (df._ridx, 3))
+            if (any (!isna (df._ridx(1:df._cnt(1), ind1, ind2)))),
+              dummy{2, 1} = [sprintf("_%d.%d", ind1, ind2) ; "Nr"];
+              dummy{3, 1} = disp (df._ridx(1:df._cnt(1), ind1, ind2)); 
+              indi = regexp (dummy{3, 1}, '\b.*\b', 'match', 'dotexceptnewline');
+              if (isempty (resu)) 
+                resu = strjust (char (dummy{2, 1}, indi), 'right');
+              else
+                resu = horzcat (resu, vspace, strjust (char(dummy{2, 1}, indi), \
+                                                       'right'), vspace);
+              endif
+            endif
+          endfor
+        endif
+      endfor
+    endif
+
+    %# emit row names
+    if (isempty (df._name{1})),
+      dummy{2, 2} = []; dummy{3, 2} = [];
+    else
+      dummy{2, 2} = [" ";" "];
+      dummy{3, 2} = df._name{1};
+    endif
+    
+    %# insert a vertical space
+    if (!isempty(dummy{3, 2}))
+      indi = ~cellfun ('isempty', dummy{3, 2});
+      if (any (indi))
+        try
+          resu = horzcat (resu, vspace, strjust (char(dummy{2, 2}, dummy{3, 2}),\
+                                                 'right'));
+        catch
+          disp ('line 172 '); keyboard
+        end_try_catch
+      endif
+    endif
+    
+    %# emit each colum
+    for indi = (1:size (dummy, 2) - 2)
+      %# was max(df._cnt(2:end)),
+      try
+        %# avoid this column touching the previous one
+        if (any (cellfun ('size', dummy(1:2, 2+indi), 2) >= \
+                 size (dummy{3, 2+indi}, 2)))
+          resu = horzcat (resu, vspace);
+        endif
+        resu = horzcat (resu, strjust (char (dummy{:, 2+indi}), 'right'));
+      catch
+        tmp_str = sprintf ("Emitting %d lines, expecting %d", ...
+                           size (dummy{3, 2+indi}, 1), df._cnt(1));
+        keyboard
+        error (tmp_str);
+      end_try_catch
+    endfor
+  else
+    resu = '';
+  endif
+  
+  resu = char (head, resu); disp (resu)
+
+endfunction