emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
From: Nick Dokos <nicholas.dokos@hp.com>
To: Sebastien Vauban <wxhgmqzgwmuf@spammotel.com>
Cc: nicholas.dokos@hp.com, emacs-orgmode@gnu.org
Subject: Re: [babel] Expertise in string manipulation available?
Date: Sun, 14 Aug 2011 20:29:02 -0400	[thread overview]
Message-ID: <26527.1313368142@alphaville.dokosmarshall.org> (raw)
In-Reply-To: Message from "Sebastien Vauban" <wxhgmqzgwmuf@spammotel.com> of "Fri, 12 Aug 2011 00:17:54 +0200." <80k4ajzj71.fsf@somewhere.org>

Sebastien Vauban <wxhgmqzgwmuf@spammotel.com> wrote:

> Hi Nick,
> 
> Nick Dokos wrote:
> > Sebastien Vauban <wxhgmqzgwmuf@spammotel.com> wrote:
> >> Hello,
> >> 
> >> #+TITLE:     String manipulation
> >> 
> >> * Data
> >> 
> >> #+tblname: list-of-couples
> >> | Me           | @Here  |
> >> | Myself and I | @There |
> >> 
> >> * Successful outcome
> >> 
> >> I expect the above table to be transformed to those lines:
> >> 
> >> #+begin_example
> >> ---
> >> Me
> >> @Here
> >> ---
> >> Myself and I
> >> @There
> >> #+end_example
> >> 
> >
> > I can do it easily in python except that I don't know how to produce
> > the #+begin/end_example block.  My results are preceded by colons:
> >
> > * Data
> >
> > #+tblname: list-of-couples
> > | Me           | @Here  |
> > | Myself and I | @There |
> >
> > #+begin_src python :var table=list-of-couples :exports code :results output :tangle no
> >   for row in table:
> >       print "---"
> >       for i in range(len(row)):
> >           print row[i]
> > #+end_src
> >
> > #+results:
> > : ---
> > : Me
> > : @Here
> > : ---
> > : Myself and I
> > : @There
> 
> This works like a charm!  Thank you very much...
> 
> Would some good soul give me hints on how to make the next code blocks work
> similarly in the other languages, I'd take every advice...
> 
> >> * First attempt
> >> 
> >> ** Code and output
> >> 
> >> #+begin_src awk :stdin list-of-couples :exports code :results output :tangle no
> >> {
> >>     print "---";
> >>     print $1;
> >>     print $2;
> >> }
> >> #+end_src
> >> 
> >> #+results:
> >> #+begin_example
> >> ---
> >> Me
> >> @Here
> >> ---
> >> Myself
> >> and
> >> #+end_example
> >> 

The problem here is that by default awk's field separator is any
sequence of white space characters (including the spaces in "Myself and
I"). But babel does break up the contents of the table using TABs
between columns, so telling awk to use TABs for field separators works
fine (but don't use TABs in your columns!):

--8<---------------cut here---------------start------------->8---
#+begin_src awk :stdin list-of-couples :exports code :results output :tangle no :cmd-line -F "\t"
{
    print "---";
    print $1;
    print $2;
}
#+end_src

#+results:
: ---
: Me
: @Here
: ---
: Myself and I
: @There
--8<---------------cut here---------------end--------------->8---


> >> ** Issue
> >> 
> >> The first line of the table is perfectly outputted.
> >> 
> >> The second line is not, because of the space in its first column: $2 refers
> >> then to the second word, not to the string of the second column.
> >> 
> >> * Second attempt
> >> 
> >> ** Code and output
> >> 
> >> #+begin_src emacs-lisp :var data=list-of-couples :exports results :results output :tangle no
> >> (mapc
> >>  (lambda (item)
> >>    (print (format "---\n%s\n%s\n"
> >>                   (first item)
> >>                   (second item))))
> >>  data)
> >> #+end_src
> >> 
> >> #+results:
> >> #+begin_example
> >> 
> >> "---
> >> Me
> >> @Here
> >> "
> >> 
> >> "---
> >> Myself and I
> >> @There
> >> "
> >> #+end_example
> >> 
> >> ** Issue
> >> 
> >> Literal double quotes are inserted in the output. Plus blank lines...

... and the problem here is the subtle difference between print and princ
(check the doc strings for these two functions for details). The following
works:

--8<---------------cut here---------------start------------->8---
#+begin_src emacs-lisp :var data=list-of-couples :exports results :results output :tangle no
(mapc
 (lambda (item)
   (princ (format "---\n%s\n%s\n"
                  (first item)
                  (second item))))
 data)
#+end_src

#+results:
: ---
: Me
: @Here
: ---
: Myself and I
: @There
--8<---------------cut here---------------end--------------->8---


Nick

> Best regards,
>   Seb
> 
> -- 
> Sebastien Vauban
> 
> 

      reply	other threads:[~2011-08-15  0:29 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-08-10 22:00 [babel] Expertise in string manipulation available? Sebastien Vauban
2011-08-10 22:17 ` Nick Dokos
2011-08-11 22:17   ` Sebastien Vauban
2011-08-15  0:29     ` Nick Dokos [this message]

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

  List information: https://www.orgmode.org/

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

  git send-email \
    --in-reply-to=26527.1313368142@alphaville.dokosmarshall.org \
    --to=nicholas.dokos@hp.com \
    --cc=emacs-orgmode@gnu.org \
    --cc=wxhgmqzgwmuf@spammotel.com \
    /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.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

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 read-only IMAP folder(s) and NNTP newsgroup(s).