ntg-context - mailing list for ConTeXt users
 help / color / mirror / Atom feed
From: Philipp Gesang <Philipp.Gesang@alumni.uni-heidelberg.de>
To: mailing list for ConTeXt users <ntg-context@ntg.nl>
Subject: Re: "Hiding" columns in m-database & TABLE
Date: Fri, 23 Nov 2012 13:38:35 +0100	[thread overview]
Message-ID: <20121123123835.GB8788@phlegethon.router_intern> (raw)
In-Reply-To: <50AE6708.5020109@wxs.nl>


[-- Attachment #1.1: Type: text/plain, Size: 5876 bytes --]

···<date: 2012-11-22, Thursday>···<from: Hans Hagen>···

> On 11/22/2012 3:36 PM, Marcin Borkowski wrote:
> >Dnia 2012-11-22, o godz. 13:26:52
> >Mojca Miklavec <mojca.miklavec.lists@gmail.com> napisał(a):
> >
> >>On Thu, Nov 22, 2012 at 12:57 PM, Marcin Borkowski wrote:
> >>>le) in order to
> >>>typeset a (nice) TABLE. However, I have a few columns I'd like to
> >>>omit.  I can (of course) hand-edit the csv file; but is there a way
> >>>to do it automatically?  Something like
> >>>
> >>>\setupTABLE[column][3,4,5][kill]
> >>>
> >>>I did [empty=yes,width=0pt] in place of [kill], and it worked, but
> >>>it seems like a hack (and I don't know whether it does actually
> >>>process the cells I'm omitting - which in my case wouldn't bother
> >>>me, but might be an additional layer of inelegance;)).  And better
> >>>ideas?
> >>
> >>If you have up to 9 columns, you could use
> >>
> >>     \def\ProcessingLine#1#2#3#4#5#6#7{%
> >>         \bTR\bTD#1\eTD\bTD#2\eTD\bTD#6\eTD\bTD#7\eTD}
> >>
> >>and then [command=\ProcessingLine]
> >
> >Well, something like 20 columns (on A4 landscape). ;)
> >
> >It turns out that my method somehow doesn't work well without setting
> >also height=0pt; then it's fine, but I'm still wondering about a
> >cleaner way.
> 
> I've added a splutter to the core:
> 
> \startluacode
> 
> local mycsvsplitter = utilities.parsers.csvsplitter {
>     separator = ",",
>     quote     = '"',
> }
> 
> local crap = [[
> "1","2","3","4"
> "a","b","c","d"
> ]]
> 
> local mycrap = mycsvsplitter(crap)
> 
> context.bTABLE()
>     for i=1,#mycrap do
>         context.bTR()
>         local c = mycrap[i]
>         for i=1,#c do
>             context.bTD()
>             context(c[i])
>             context.eTD()
>         end
>         context.eTR()
>     end
> context.eTABLE()
> 
> \stopluacode

Hi Hans,

although csv is not a standard per se there is nevertheless an
rfc: <http://tools.ietf.org/html/rfc4180>. Can we have an
optional rfc-compliant parser as well? That entails interpreting
the first line as field header if it consists entirely of
unquoted fields -- neat feature as one can treat these as column
identifiers to query fields in a more natural fashion.

·································································

\starttext
\startluacode

local P, R, V, S, C, Ct, Cs, Carg, Cc, Cg, Cf = lpeg.P, lpeg.R, lpeg.V, lpeg.S, lpeg.C, lpeg.Ct, lpeg.Cs, lpeg.Carg, lpeg.Cc, lpeg.Cg, lpeg.Cf

local lpegmatch = lpeg.match
local patterns = lpeg.patterns
local newline  = patterns.newline

-----------------------------------------------------------------------
--                        RFC 4180 csv parser
-----------------------------------------------------------------------

-- based on http://tools.ietf.org/html/rfc4180
-- notable deviations from the RFC grammar:
--   · allow overriding “comma” and “quote” chars in spec
--   · the “textdata” rule is extrapolated to mean, basically,
--     “everything but the quote character”, not just the character
--     range as in the RFC
--   · newline from l-lpeg.lua instead of “crlf”

local rfc4180_spec = { separator = ",", quote     = [["]] }

utilities.parsers.rfc4180_splitter = function (specification)
    specification     = specification or rfc4180_spec
    local separator   = specification.separator --> rfc: COMMA
    local quotechar   = P(specification.quote)  -->      DQUOTE
    local dquotechar  = quotechar * quotechar   -->      2DQUOTE
                      / specification.quote

    local separator   = S(separator ~= "" and separator or ",")
    local escaped     = quotechar
                      * Cs((dquotechar + (1 - quotechar))^0)
                      * quotechar
    local non_escaped = C((1 - quotechar - newline - separator)^1)
    local field       = escaped + non_escaped
    local record      = Ct(field * (separator * field)^0)
    local name        = field -- sic!
    local header      = Cg(Ct(name * (separator * name)^0), "header")
    local file        = Ct((header * newline)^-1 -- optional header
                         * record
                         * (newline * record)^0
                         * newline^0)
    return function (data) return lpegmatch (file, data) end
end

-----------------------------------------------------------------------
--                  example writer (natural table)
-----------------------------------------------------------------------

local print_csv_table = function (tab)
  local header = tab.header
  context.setupTABLE({ frame = "off" })
  context.setupTABLE({"header"}, { background  = "screen" })
  context.bTABLE()
    if header then
      context.bTABLEhead()
      context.bTR()
      for i=1,#header do
        context.bTH()
        context(header[i])
        context.eTH()
      end
      context.eTR()
      context.eTABLEhead()
    end
    context.bTABLEbody()
    for i=1,#tab do
      context.bTR()
      local c = tab[i]
      for i=1,#c do
        context.bTD()
        context(c[i])
        context.eTD()
      end
      context.eTR()
    end
    context.eTABLEbody()
  context.eTABLE()
end

-----------------------------------------------------------------------
--                               usage
-----------------------------------------------------------------------

local mycsvsplitter = utilities.parsers.rfc4180_splitter ()

local crap = [[
first,second,third,fourth
"1","2","3","4"
"a","b","c","d"
"foo","bar""baz","boogie","xyzzy"
]]

local mycrap = mycsvsplitter(crap)

print_csv_table (mycrap)

-----------------------------------------------------------------------

\stopluacode
\stoptext

[-- Attachment #1.2: Type: application/pgp-signature, Size: 198 bytes --]

[-- Attachment #2: Type: text/plain, Size: 485 bytes --]

___________________________________________________________________________________
If your question is of interest to others as well, please add an entry to the Wiki!

maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context
webpage  : http://www.pragma-ade.nl / http://tex.aanhet.net
archive  : http://foundry.supelec.fr/projects/contextrev/
wiki     : http://contextgarden.net
___________________________________________________________________________________

  reply	other threads:[~2012-11-23 12:38 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-11-22 11:57 Marcin Borkowski
2012-11-22 12:26 ` Mojca Miklavec
2012-11-22 14:36   ` Marcin Borkowski
2012-11-22 16:12     ` Alan BRASLAU
2012-11-22 17:55     ` Hans Hagen
2012-11-23 12:38       ` Philipp Gesang [this message]
2012-11-23 16:40         ` Hans Hagen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20121123123835.GB8788@phlegethon.router_intern \
    --to=philipp.gesang@alumni.uni-heidelberg.de \
    --cc=ntg-context@ntg.nl \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).