Re: Importing a file and extracting data

*To*: mathgroup at smc.vnet.net*Subject*: [mg131161] Re: Importing a file and extracting data*From*: Helen Read <readhpr at gmail.com>*Date*: Sat, 15 Jun 2013 04:20:28 -0400 (EDT)*Delivered-to*: l-mathgroup@mail-archive0.wolfram.com*Delivered-to*: l-mathgroup@wolfram.com*Delivered-to*: mathgroup-outx@smc.vnet.net*Delivered-to*: mathgroup-newsendx@smc.vnet.net*References*: <kpeln9$htb$1@smc.vnet.net>

For starters, make sure you import your file as a Table. data = Import["filename", "Table"] Now find where Run 1 and Run 2 begin. p1 = Position[data, {"Run", 1}][[1, 1]] p2 = Position[data, {"Run", 2}][[1, 1]] For Run 1, we want the part of the table from just after p1 to right before p2. Delete the blank rows {} while you are at it. run1 = DeleteCases[data[[p1 + 1 ;; p2 - 1]], {}] For Run 2, we want everything from right after p2 to the end. run2 = DeleteCases[data[[p2 + 1 ;; Length[data]]], {}] So now we have two tables, run1 and run2. We need to extract the temperature and time from each row of the tables. The rows look for example like the following. {"Tc_Naph_83_2C", 3.758, "ns"} The basic idea is to construct a function to operate on one row of the table, then Map it across the table. You can do this quite compactly using pure functions, but if you are new to this sort of thing you might find it easier to follow if you write an explicit function that operates on one row of the table at a time. I will use x to represent one row. To begin, we get the first two parts of row x. x[[1]] contains the temperature information (but needs some processing). x[[2]] is the time. In the example row, x[[1]] is "Tc_Naph_83_2C" Use StringSplit on the "_" to get at the pieces. StringSplit["Tc_Naph_83_2C", "_"] results in {"Tc", "Naph", "83", "2C"} Now, we get the 2nd-to-the-last part of this (the "83" in the example), and the last part (the "2C"). We drop the last character from the "2C". Then join the "83" with a "." and the "2". Finally, use ToExpression to convert "83.2" from a string to a number. Putting this all together, here is a function to extract the temperature and time from one row of the table. I've used some local variables {split,temperature,time} to keep track of things as we go. f[x_] := Module[{split, temperature, time}, time = x[[2]]; split = StringSplit[x[[1]], "_"]; temperature = ToExpression[ StringJoin[split[[-2]], ".", StringDrop[split[[-1]], -1]]]; {temperature, time} ] The input of the function, x, represents one row of the table. The output is the ordered pair {temperature,time} Test it out on a single row. f[{"Tc_Naph_84_2C", 3.74`, "ns"}] Now simply Map the function over each run. Map[f, run1] Map[f,run2] Helen Read University of Vermont On 6/14/2013 4:54 AM, howardfink at gmail.com wrote: > I have a series of files of this form: > > June 7, 2013 > Tc+Naphthalene vs Temperature (oC) > > Run 1 > Tc_Naph_84_2C 3.740 ns > Tc_Naph_87_1C 3.731 ns > Tc_Naph_89_9C 3.720 ns > Tc_Naph_92_9C 3.704 ns > Tc_Naph_94_7C 3.687 ns > Tc_Naph_97_6C 3.694 ns > > > Run 2 > Tc_Naph_83_2C 3.758 ns > Tc_Naph_83_4C 3.750 ns > Tc_Naph_86_4C 3.728 ns > Tc_Naph_88_1C 3.725 ns > Tc_Naph_90_2C 3.716 ns > Tc_Naph_93_1C 3.704 ns > Tc_Naph_94_7C 3.673 ns > Tc_Naph_97_7C 3.684 ns > Tc_Naph_97_9C 3.665 ns > > > > > I used an Import command to read in the file, but now I am just sitting and= > staring, without a clue how to get the 84_2 converted to the number 84.2,e= > tc. and ending up with two lists: Run 1 and Run 2, consisting of pairs of t= > emperature and time. The temperature will eventually be converted to 1/abs= > olute temperature. > > I've read lots and lots of help, thumbed through dozens of pages of a Mathe= > matica 5 manual, and don't know where to start. I'm trying to help a 90-ye= > ar-old chemistry professor, who is currently using a calculator, but there= > will be dozens of runs of this experiment. >