Re: Import numerical data and split by pattern
- To: mathgroup at smc.vnet.net
- Subject: [mg94483] Re: Import numerical data and split by pattern
- From: Szabolcs Horvát <szhorvat at gmail.com>
- Date: Sun, 14 Dec 2008 07:40:39 -0500 (EST)
- Organization: University of Bergen
- References: <ghtjl9$rfu$1@smc.vnet.net>
Gehricht at googlemail.com wrote: > Hi! > > I am asking this more out of curiosity, but is there a neat way to > accomplish the following task within Mathematica. > Suppose I have a file as follows > ## a b c > 1 1.0 > 2 2.0 > # d e f > 3 3.0 > 4 4.0 > ## c d e > 5 5.0 > 6 6.0 > .... > Now I want everything between ## and # in a separate list, i.a. list1= > {{1,1.0},{2,2.0}}, list2={{5,5.0},{6,6.0}}, etc. > How could I get this? I don't like to use Mathematica for such tasks because importing inhomogeneous data (mixed number types, strings, etc.) is slow, and Mathematica is not very good at text processing (parsing a special file format). So if you have a lot of data, preprocess it with some other tool, and convert it to a format that Mathematica can process more easily. There's no built-in way to only read the numbers that are between lines starting with ## and #, but not between # and ## ... If you have little data and speed is not a problem then you can do something like this: In[1]:= data = ImportString[ "## a b c 1 1.0 2 2.0 # d e f 3 3.0 4 4.0 ## c d e 5 5.0 6 6.0 ", "Table"] Out[1]= {{"##", "a", "b", "c"}, {1, 1.}, {2, 2.}, {"#", "d", "e", "f"}, {3, 3.}, {4, 4.}, {"##", "c", "d", "e"}, {5, 5.}, {6, 6.}} In[2]:= Split[data, ! MatchQ[First[#2], "#" | "##"] &] Out[2]= {{{"##", "a", "b", "c"}, {1, 1.}, {2, 2.}}, {{"#", "d", "e", "f"}, {3, 3.}, {4, 4.}}, {{"##", "c", "d", "e"}, {5, 5.}, {6, 6.}}} In[3]:= Select[%, #[[1, 1]] == "##" &] Out[3]= {{{"##", "a", "b", "c"}, {1, 1.}, {2, 2.}}, {{"##", "c", "d", "e"}, {5, 5.}, {6, 6.}}} In[4]:= Rest /@ % Out[4]= {{{1, 1.}, {2, 2.}}, {{5, 5.}, {6, 6.}}}