That solution works great! I followed the discussion that followed in that thread and have adopted the following solution in my config for now.
| / | <#> | | <r> |
| | 1n | 2y | 3y |
# Exports to ASCII as
# 2y 3y
| / | <r> | <#> | |
| | 1y | 2n | 3y |
# Exports to ASCII as
# 1y 3y
| / | <r> | <#> |
| 1y | 2y | 3n |
# Exports to ASCII as
# 1y 2y
| / | <#> | <#> | <r> | <#> | <#> | <#> |
| | 1n | 2n | 3y | 4n | 5n | 6n |
# Exports to ASCII as
# 3y
| / | <r> | <l> | <r> | <l> | <r> | <l> |
| / | <#> | <#> | <#> | | <#> | <#> |
| | 1n | 2n | 3n | 4y | 5n | 6n |
# Exports to ASCII as
# 4y
# Same result with a less useful notation:
| / | <r> | <l> | <r> | <l> | <r> | <l> |
| / | <#> | <#> | | | <#> | <#> |
| / | | <#> | <#> | | | |
| | 1n | 2n | 3n | 4y | 5n | 6n |
# Exports to ASCII as
# 4y
# Deletion must not get trapped with this:
| / | <r> | <l> | <r> | <l> | <r> | <l> |
| / | | | | | | |
| | <#> | <#> | <#> | | | |
| | 1y | 2y | 3y | 4y | 5y | 6y |
# Exports to ASCII as
# <#> <#> <#>
# 1y 2y 3y 4y 5y 6y
* COMMENT
#+BEGIN_SRC emacs-lisp
(defun mbrand/org-export-delete-commented-cols (back-end)
"Delete columns $2 to $> marked as `<#>' on a row with `/' in $1.
If you want a non-empty column $1 to be deleted make it $2 by
inserting an empty column before and adding `/' in $1."
(while (re-search-forward "^[ \t]*| +/ +|\\(.*|\\)? +\\(<#>\\) *|" nil t)
(goto-char (match-beginning 2))
(org-table-delete-column)
(beginning-of-line)))
(add-hook 'org-export-before-processing-hook #'mbrand/org-export-delete-commented-cols)
;; (remove-hook 'org-export-before-processing-hook #'mbrand/org-export-delete-commented-cols)
#+END_SRC