11
$\begingroup$

in this expression = "{1 2 3 4 5 6 7 8}", I want to replace each space by a comma , to get {1,2,3,4,5,6,7,8}.

$\endgroup$
4
  • $\begingroup$ Try this. expression = "{1 2 3 4 5 6 7 8}"; ToExpression@StringSplit[ StringReplace[expression, "{" | "}" -> ""]] $\endgroup$ Commented Dec 16, 2015 at 6:47
  • $\begingroup$ @PlatoManiac, thanks for your answer! $\endgroup$ Commented Dec 16, 2015 at 7:00
  • $\begingroup$ related: 50403 $\endgroup$
    – Kuba
    Commented Dec 16, 2015 at 7:06
  • $\begingroup$ ImportString[StringReplace["{1 2 3 4 5 6 7 8}", "{" | "}" -> ""], "List", "LineSeparators" -> " "] $\endgroup$ Commented Dec 16, 2015 at 7:12

9 Answers 9

14
$\begingroup$
expression = "{1 2 3 4 5 6 7 8}";

A few alternatives to PlatoManiac's approach:

ToExpression[
    expression, 
    StandardForm, 
    Function[e, Sequence @@@ Unevaluated[e], HoldAll]
]

or

ToExpression @ StringReplace[expression, " " -> ","]
{1, 2, 3, 4, 5, 6, 7, 8} 

or

 StringCases[expression, n : NumberString :> ToExpression[n]]

 ToExpression @ StringCases[expression, NumberString]
$\endgroup$
11
$\begingroup$

A possibility with WhitespaceCharacter

ToExpression@
     StringReplace[expression, WhitespaceCharacter -> ","]

(* {1, 2, 3, 4, 5, 6, 7, 8} *)

Another using Interpreter

Interpreter[
   DelimitedSequence["Integer", {"{", " ", "}"}]][expression]
$\endgroup$
0
10
$\begingroup$

My thought was to drop the brackets using StringTake and then import it using ImportString

"{1 2 3 4 5 6 7 8}"~StringTake~{2, -2}~ImportString~"Table" // First
(* {1, 2, 3, 4, 5, 6, 7, 8} *)

edit I just realized this is very similar to what J.M. suggested in his comment (although I'm playing around with infix notation here).

$\endgroup$
2
  • 1
    $\begingroup$ It's not so similar to JMs version and in fact, I was going to post exactly this solution, because I think it is noteworthy that a space-separated list of numbers can be imported as "Table". +1 $\endgroup$
    – halirutan
    Commented Dec 16, 2015 at 8:39
  • $\begingroup$ Thanks, it was my first thought since I'm regularly running python (or c or fortran) code that outputs a big list or matrix and the quickest way for me to plot it is to just copy it and paste it into an ImportString command. $\endgroup$
    – Jason B.
    Commented Dec 16, 2015 at 8:47
7
$\begingroup$

Since space is implicit Times similar methods to Convert head Times to List can be applied:

Block[{Times = List}, ToExpression @ "{1 2 3 4 5 6 7 8}"] // First
{1, 2, 3, 4, 5, 6, 7, 8}

Though in this case a much shorter method works too:

ToHeldExpression[expression] ~Level~ {3}
{1, 2, 3, 4, 5, 6, 7, 8}
$\endgroup$
6
$\begingroup$

Another solution, inspired by Kuba's first one:

Sequence @@@ ToExpression[expression, StandardForm, Inactivate] 
$\endgroup$
3
$\begingroup$

Another way is to use StringRiffle:

ToExpression[StringRiffle[StringSplit["{1 2 3 4 5 6 7 8}"], ","]]
{1, 2, 3, 4, 5, 6, 7, 8}

Note that StringRiffle can also perform the inverse operation too:

StringRiffle[{1, 2, 3, 4, 5, 6, 7, 8}, {"{", ", ", "}"}]
"{1, 2, 3, 4, 5, 6, 7, 8}"
$\endgroup$
3
$\begingroup$
str = "{1 2 3 4 5 6 7 8}";

Using StringCases with NumberString

ToExpression @ StringCases[str, NumberString]

{1, 2, 3, 4, 5, 6, 7, 8}

$\endgroup$
2
$\begingroup$

A similar case to "{1 2 3 4 5 6 7 8}", that also appears when you extract data from txt, is {"1 2 3 4 5 6 7 8"}

In that case, one can use

ToExpression@ StringSplit@ {"1 2 3 4 5 6"}
$\endgroup$
2
$\begingroup$

Using Composition :

strToList = Composition[
  ToExpression,
  StringSplit,
  StringReplace[#,
    PunctuationCharacter :> ""] &
  ];

alist = strToList@expression

{1, 2, 3, 4, 5, 6, 7, 8}


Alternate notation:

ToExpression @*
  StringSplit@*(StringReplace[#, 
     PunctuationCharacter :> ""] &)@expression
$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.