emacs-orgmode
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [O] [babel] Expertise in string manipulation available?


From: Nick Dokos
Subject: Re: [O] [babel] Expertise in string manipulation available?
Date: Sun, 14 Aug 2011 20:29:02 -0400

Sebastien Vauban <address@hidden> wrote:

> Hi Nick,
> 
> Nick Dokos wrote:
> > Sebastien Vauban <address@hidden> 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 via email to

[Prev in Thread] Current Thread [Next in Thread]