From mboxrd@z Thu Jan 1 00:00:00 1970 From: Nick Dokos Subject: Re: [babel] Expertise in string manipulation available? Date: Sun, 14 Aug 2011 20:29:02 -0400 Message-ID: <26527.1313368142@alphaville.dokosmarshall.org> References: <801uwtapvu.fsf@somewhere.org> <6036.1313014624@alphaville.americas.hpqcorp.net> <80k4ajzj71.fsf@somewhere.org> Reply-To: nicholas.dokos@hp.com Return-path: Received: from eggs.gnu.org ([140.186.70.92]:50023) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Qsl3E-0004bR-8M for emacs-orgmode@gnu.org; Sun, 14 Aug 2011 20:29:09 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Qsl3D-0007FR-35 for emacs-orgmode@gnu.org; Sun, 14 Aug 2011 20:29:08 -0400 Received: from g4t0014.houston.hp.com ([15.201.24.17]:10745) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Qsl3C-0007FN-U8 for emacs-orgmode@gnu.org; Sun, 14 Aug 2011 20:29:07 -0400 In-Reply-To: Message from "Sebastien Vauban" of "Fri, 12 Aug 2011 00:17:54 +0200." <80k4ajzj71.fsf@somewhere.org> List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: Sebastien Vauban Cc: nicholas.dokos@hp.com, emacs-orgmode@gnu.org Sebastien Vauban wrote: > Hi Nick, > > Nick Dokos wrote: > > Sebastien Vauban 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 > >