# Converting a string containing whitespace-delimited numbers to a list of numbers

Suppose I have a string str that contains only whitespace-delimited real numbers:

str = " 0\t1.46604\t1.44829\t12.0546\t1.57075\t1.64044\t12.0489\t1.58142";


I would like to convert str to a list of real numbers. One way to accomplish this is to split the string using StringSplit and then Map the function ToExpression across the resulting list:

Map[ToExpression, StringSplit[str]]


which gives the correct output:

{0, 1.46604, 1.44829, 12.0546, 1.57075, 1.64044, 12.0489, 1.58142}

But, is there a cleaner or more efficient way to do this? I will be converting about 100,000 strings str -- each of which are approximately the same length as the example str above -- which will be read as records from a text file (i.e., using OpenRead and Read), so it would be nice if the method is relatively efficient. Thank you for your time!

-
Although, I'm not sure why, ToExpression["{" <> StringReplace[str, "\t" -> ", "] <> "}"] seems to be a tad faster than both StringSplit and StringToDouble methods. –  kale Sep 2 '12 at 23:06
@kale probably because you are only searching for /t, and not for the other possible string separators Whitespace is taken to include spaces, tabs and newlines. –  belisarius Sep 2 '12 at 23:09
@kale, not clearly faster than StringToDouble in my test. Also probably because there's only one string to expression conversion there –  Rojo Sep 2 '12 at 23:10
@Rojo, Yeah, we're not talking much, but consistently a little faster on my machine. –  kale Sep 2 '12 at 23:11

str = " 0\t1.46604\t1.44829\t12.0546\t1.57075\t1.64044\t12.0489\t1.58142";
ToExpression[StringSplit[str, Whitespace]]

(* {0, 1.46604, 1.44829, 12.0546, 1.57075, 1.64044, 12.0489, 1.58142} *)

-
Nice one +1, I didn't realise ToExpression was listable –  Rojo Sep 3 '12 at 13:11

Alternatively, since your data is separated by tabs:

data = "0\t1.46604\t1.44829\t12.0546\t1.57075\t1.64044\t12.0489\t1.58142";
ImportString[data, "TSV"] // First
{0, 1.46604, 1.44829, 12.0546, 1.57075, 1.64044, 12.0489, 1.58142}

-
InternalStringToDouble /@ StringSplit[str]

If you had some long string perhaps you could also try Flatten@ImportString[str, "Table"]`