emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
* [babel] Expertise in string manipulation available?
@ 2011-08-10 22:00 Sebastien Vauban
  2011-08-10 22:17 ` Nick Dokos
  0 siblings, 1 reply; 4+ messages in thread
From: Sebastien Vauban @ 2011-08-10 22:00 UTC (permalink / raw)
  To: emacs-orgmode-mXXj517/zsQ

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

* 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

** 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...

Best regards,
  Seb

-- 
Sebastien Vauban

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [babel] Expertise in string manipulation available?
  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
  0 siblings, 1 reply; 4+ messages in thread
From: Nick Dokos @ 2011-08-10 22:17 UTC (permalink / raw)
  To: Sebastien Vauban; +Cc: nicholas.dokos, emacs-orgmode

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:

--8<---------------cut here---------------start------------->8---
* 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
--8<---------------cut here---------------end--------------->8---

Nick

> * 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
> 
> ** 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...
> 
> Best regards,
>   Seb
> 
> -- 
> Sebastien Vauban
> 
> 

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [babel] Expertise in string manipulation available?
  2011-08-10 22:17 ` Nick Dokos
@ 2011-08-11 22:17   ` Sebastien Vauban
  2011-08-15  0:29     ` Nick Dokos
  0 siblings, 1 reply; 4+ messages in thread
From: Sebastien Vauban @ 2011-08-11 22:17 UTC (permalink / raw)
  To: emacs-orgmode-mXXj517/zsQ

Hi Nick,

Nick Dokos wrote:
> Sebastien Vauban <wxhgmqzgwmuf-geNee64TY+gS+FvcfC7Uqw@public.gmane.org> 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
>> 
>> ** 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...

Best regards,
  Seb

-- 
Sebastien Vauban

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [babel] Expertise in string manipulation available?
  2011-08-11 22:17   ` Sebastien Vauban
@ 2011-08-15  0:29     ` Nick Dokos
  0 siblings, 0 replies; 4+ messages in thread
From: Nick Dokos @ 2011-08-15  0:29 UTC (permalink / raw)
  To: Sebastien Vauban; +Cc: nicholas.dokos, emacs-orgmode

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
> 
> 

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2011-08-15  0:29 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
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

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).