# Parse vector from string

**URL:** https://discourse.julialang.org/t/parse-vector-from-string/10728
**Category:** General Usage
**Tags:** strings, sparse
**Created:** [May 5, 2018, 4:14pm UTC](https://discourse.julialang.org/t/parse-vector-from-string/10728 "2018-05-05T16:14:02Z")
**Posts on this page:** 20
**Page:** 1

<div class="post-metadata">

### Author: ![cortner](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/cortner/32/204_2.png) [@cortner](https://discourse.julialang.org/u/cortner)
#### Post date: [May 5, 2018, 4:14pm UTC](https://discourse.julialang.org/t/parse-vector-from-string/10728/1 "2018-05-05T16:14:03Z")

</div>

I can parse(Int, „123“) but I cannot find a simple way to parse(Vector{Int}, „[1, 2, 3]”). Is there a “canned” solution?

---

<div class="post-metadata">

### Author: ![pdeffebach](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/pdeffebach/32/10320_2.png) [@pdeffebach](https://discourse.julialang.org/u/pdeffebach)
#### Post date: [May 5, 2018, 4:17pm UTC](https://discourse.julialang.org/t/parse-vector-from-string/10728/2 "2018-05-05T16:17:51Z")

</div>

Broadcast the function.

```julia
x = ["1", "2", "3"]
y = parse.(Int64,x)

```

---

<div class="post-metadata">

### Author: ![kristoffer.carlsson](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kristoffer.carlsson/32/22_2.png) [@kristoffer.carlsson](https://discourse.julialang.org/u/kristoffer.carlsson)
#### Post date: [May 5, 2018, 4:24pm UTC](https://discourse.julialang.org/t/parse-vector-from-string/10728/3 "2018-05-05T16:24:20Z")

</div>

If it is arbitrary julia code you can `Meta.parse` and eval it it but perhaps using something like JSON would be more suitable here?

If you just need to parse this exact format, splitting on the comma and broadcasting the `parse` would likely be the most efficient.

---

<div class="post-metadata">

### Author: ![chakravala](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/chakravala/32/6832_2.png) [@chakravala](https://discourse.julialang.org/u/chakravala)
#### Post date: [May 5, 2018, 4:46pm UTC](https://discourse.julialang.org/t/parse-vector-from-string/10728/4 "2018-05-05T16:46:04Z")

</div>

> [@kristoffer.carlsson](#):
>
> If you just need to parse this exact format, splitting on the comma and broadcasting the parse would likely be the most efficient.

Not necessarily sure if it is always faster to broadcast and do multiple calls to the parser instead of calling the parser a single time to instead parse a slightly larger string. Might be better sometimes to make single call.

---

<div class="post-metadata">

### Author: ![kristoffer.carlsson](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kristoffer.carlsson/32/22_2.png) [@kristoffer.carlsson](https://discourse.julialang.org/u/kristoffer.carlsson)
#### Post date: [May 5, 2018, 4:49pm UTC](https://discourse.julialang.org/t/parse-vector-from-string/10728/5 "2018-05-05T16:49:09Z")

</div>

> [@chakravala](#):
>
> Not necessarily sure if it is always faster to broadcast and do multiple calls to the parser instead of calling the parser a single time to instead parse a slightly larger string. Might be better sometimes to make single call.

The julia source code parser and the parser that parses types like `Int`s are two completely different things.

```julia
julia> f(x) = parse(Int, x)
f (generic function with 1 method)

julia> @btime f("2")
  46.842 ns (0 allocations: 0 bytes)
2

julia> g(x) = Meta.parse(x)
f (generic function with 1 method)

julia> @btime g("2")
  19.187 μs (7 allocations: 208 bytes)
2

```

You should only use `Meta.parse` if you are parsing actual julia source code.

---

<div class="post-metadata">

### Author: ![mbauman](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mbauman/32/31082_2.png) [@mbauman](https://discourse.julialang.org/u/mbauman)
#### Post date: [May 5, 2018, 5:07pm UTC](https://discourse.julialang.org/t/parse-vector-from-string/10728/6 "2018-05-05T17:07:53Z")

</div>

As a simple solution in the past I’ve used:

```julia
@assert str[1] == '[' && str[end] == ']'
CSV.read(IOBuffer(str[2:prevind(str, end)]), header=false, transpose=true)

```

---

<div class="post-metadata">

### Author: ![cortner](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/cortner/32/204_2.png) [@cortner](https://discourse.julialang.org/u/cortner)
#### Post date: [May 5, 2018, 5:23pm UTC](https://discourse.julialang.org/t/parse-vector-from-string/10728/7 "2018-05-05T17:23:44Z")

</div>

Thank you - I was looking as CSC but didn’t see this trick.

---

<div class="post-metadata">

### Author: ![cortner](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/cortner/32/204_2.png) [@cortner](https://discourse.julialang.org/u/cortner)
#### Post date: [May 5, 2018, 5:24pm UTC](https://discourse.julialang.org/t/parse-vector-from-string/10728/8 "2018-05-05T17:24:59Z")

</div>

For curiosity, if I am given a strIng as Inshowed then how do Inconvert it into an array of strings?

---

<div class="post-metadata">

### Author: ![pdeffebach](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/pdeffebach/32/10320_2.png) [@pdeffebach](https://discourse.julialang.org/u/pdeffebach)
#### Post date: [May 5, 2018, 6:04pm UTC](https://discourse.julialang.org/t/parse-vector-from-string/10728/9 "2018-05-05T18:04:08Z")

</div>

Sorry for misunderstanding earlier. Here’s something you can do if you really have to work with the string `"[1, 2, 3]"`

```julia
x = "[1, 2, 3]"
rr = r"([0-9])" # you can alter this to work with numbers with decimal places
matches = [parse(Int64,t.match) for t in eachmatch(rr, x)]

> 3-element Array{Int64,1}:
 1
 2
 3

```

---

<div class="post-metadata">

### Author: ![cortner](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/cortner/32/204_2.png) [@cortner](https://discourse.julialang.org/u/cortner)
#### Post date: [May 5, 2018, 6:07pm UTC](https://discourse.julialang.org/t/parse-vector-from-string/10728/10 "2018-05-05T18:07:03Z")

</div>

Very interesting, thank you. I’ll need to spend some time understanding this 🙂

---

<div class="post-metadata">

### Author: ![pdeffebach](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/pdeffebach/32/10320_2.png) [@pdeffebach](https://discourse.julialang.org/u/pdeffebach)
#### Post date: [May 6, 2018, 12:17am UTC](https://discourse.julialang.org/t/parse-vector-from-string/10728/11 "2018-05-06T00:17:30Z")

</div>

Another workaround is to make it a full expression

```julia
vec = "[1, 2, 3]"
y = "y = "
t = y * vec
out = eval(parse(t))

```

---

<div class="post-metadata">

### Author: ![mbauman](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mbauman/32/31082_2.png) [@mbauman](https://discourse.julialang.org/u/mbauman)
#### Post date: [May 6, 2018, 1:29am UTC](https://discourse.julialang.org/t/parse-vector-from-string/10728/12 "2018-05-06T01:29:04Z")

</div>

Definitely don’t do that. Using `eval` — and especially `eval(parse(…))` — is a major red flag. It doesn’t work the way you expect within functions and it is prone to security issues and surprising bugs.

---

<div class="post-metadata">

### Author: ![puerco-errante](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/puerco-errante/32/19468_2.png) [@puerco-errante](https://discourse.julialang.org/u/puerco-errante)
#### Post date: [March 7, 2022, 2:21pm UTC](https://discourse.julialang.org/t/parse-vector-from-string/10728/13 "2022-03-07T14:21:57Z")

</div>

Hi! I’m a bit of a metaprogramming noob but I’d like to understand a bit better why parsing a string that looks like the definition of a vector could be a bad idea. If you can point me to some relevant documentation I’d be very happy 🙂

---

<div class="post-metadata">

### Author: ![stevengj](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/stevengj/32/71_2.png) [@stevengj](https://discourse.julialang.org/u/stevengj)
#### Post date: [March 7, 2022, 2:26pm UTC](https://discourse.julialang.org/t/parse-vector-from-string/10728/14 "2022-03-07T14:26:52Z")

</div>

See this thread: [How to warn new users away from metaprogramming](https://discourse.julialang.org/t/how-to-warn-new-users-away-from-metaprogramming/35022), e.g. my comment on avoiding misuse of metaprogramming: [How to warn new users away from metaprogramming - #22 by stevengj](https://discourse.julialang.org/t/how-to-warn-new-users-away-from-metaprogramming/35022/22)

---

<div class="post-metadata">

### Author: ![puerco-errante](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/puerco-errante/32/19468_2.png) [@puerco-errante](https://discourse.julialang.org/u/puerco-errante)
#### Post date: [March 7, 2022, 2:40pm UTC](https://discourse.julialang.org/t/parse-vector-from-string/10728/15 "2022-03-07T14:40:30Z")

</div>

Thanks a lot! Your comment and many other valid points in the thread were quite useful.

---

<div class="post-metadata">

### Author: ![mbauman](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mbauman/32/31082_2.png) [@mbauman](https://discourse.julialang.org/u/mbauman)
#### Post date: [March 7, 2022, 2:45pm UTC](https://discourse.julialang.org/t/parse-vector-from-string/10728/16 "2022-03-07T14:45:44Z")

</div>

The bigger problem than `Meta.parse` is `eval`:

> [@mbauman](#):
>
> It doesn’t work the way you expect within functions

Julia’s `eval` only works at global scope. If you do something like `eval(parse("y = [1,2,3]"))`, it’ll create a global `y` that’s separate from any local `y`s you might have inside your function. At best, it’ll be very slow and fragile.

> [@mbauman](#):
>
> it is prone to security issues

Especially if you’re parsing user input.

```julia
julia> eval(Meta.parse("[1,2,3,run(`echo 'rm -rf /'`)]"));
rm -rf /

```

Oops.

---

<div class="post-metadata">

### Author: ![floswald](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/floswald/32/195_2.png) [@floswald](https://discourse.julialang.org/u/floswald)
#### Post date: [November 6, 2022, 12:49pm UTC](https://discourse.julialang.org/t/parse-vector-from-string/10728/17 "2022-11-06T12:49:46Z")

</div>

that’s a pretty good example! thanks

---

<div class="post-metadata">

### Author: ![floswald](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/floswald/32/195_2.png) [@floswald](https://discourse.julialang.org/u/floswald)
#### Post date: [November 6, 2022, 12:50pm UTC](https://discourse.julialang.org/t/parse-vector-from-string/10728/18 "2022-11-06T12:50:08Z")

</div>

awesome solution. works perfectly for me. thanks

---

<div class="post-metadata">

### Author: ![rocco\_sprmnt21](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rocco_sprmnt21/32/20127_2.png) [@rocco\_sprmnt21](https://discourse.julialang.org/u/rocco_sprmnt21)
#### Post date: [November 6, 2022, 2:47pm UTC](https://discourse.julialang.org/t/parse-vector-from-string/10728/19 "2022-11-06T14:47:30Z")

</div>

a slightly different version but similar to other proposals

```julia
vecfromstr(str)=parse.(Int,split(filter(x->isdigit(x)||x==',', str),','))

```

---

<div class="post-metadata">

### Author: ![rocco\_sprmnt21](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rocco_sprmnt21/32/20127_2.png) [@rocco\_sprmnt21](https://discourse.julialang.org/u/rocco_sprmnt21)
#### Post date: [November 6, 2022, 2:51pm UTC](https://discourse.julialang.org/t/parse-vector-from-string/10728/20 "2022-11-06T14:51:34Z")

</div>

this expression gives me the following error

```julia
julia> CSV.read(IOBuffer(str[2:prevind(str, end)]), header=false, transpose=true)
ERROR: ArgumentError: provide a valid sink argument, like `using DataFrames; CSV.read(source, DataFrame)`

```

[Next page](https://discourse.julialang.org/t/parse-vector-from-string/10728.md?page=2)
