# Using Julia's clipboard() function with numerical data in columns

**URL:** <https://discourse.julialang.org/t/using-julias-clipboard-function-with-numerical-data-in-columns/59223>\
**Category:** General Usage\
**Tags:** question, parsing\
**Created:** [April 13, 2021, 6:26pm UTC](https://discourse.julialang.org/t/using-julias-clipboard-function-with-numerical-data-in-columns/59223 "2021-04-13T18:26:47Z")\
**Posts on this page:** 14\
**Page:** 1

<div class="post-metadata">

**Author:** ![rafael.guerra](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rafael.guerra/32/216610_2.png) [@rafael.guerra](https://discourse.julialang.org/u/rafael.guerra)\
**Post date:** [April 13, 2021, 6:26pm UTC](https://discourse.julialang.org/t/using-julias-clipboard-function-with-numerical-data-in-columns/59223/1 "2021-04-13T18:26:47Z")

</div>

When copying to clipboard numeric columnar data similar to (but in larger sizes):

```julia
675.7 2962
636.6 2961
565.9 2964
517.5 2956

```

from a Win10 text editor to the REPL via Julia’s `clipboard()` function, the following string is produced:

```julia
julia> str = clipboard()
"675.7 2962\r\n636.6 2961\r\n565.9 2964\r\n517.5 2956"

```

Do we need to use Regex to parse this into a matrix of floats or there is a simpler way?

The code below parses it to a column vector but then this would require counting the number of columns/rows to reshape it, which is not practical.

```julia
julia> parse.(Float64, split(str))
8-element Vector{Float64}:
  675.7
 2962.0
  636.6
 2961.0
  565.9
 2964.0
  517.5
 2956.0

```

A vector of strings can be also be obtained with:

```julia
julia> split(str, "\r\n")
4-element Vector{SubString{String}}:
 "675.7 2962"
 "636.6 2961"
 "565.9 2964"
 "517.5 2956"

```

This last form seems easier to attack.

---

<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:** [April 13, 2021, 7:43pm UTC](https://discourse.julialang.org/t/using-julias-clipboard-function-with-numerical-data-in-columns/59223/2 "2021-04-13T19:43:05Z")

</div>

Use `xlcopy` from [ActuaryUtilities.jl](https://github.com/JuliaActuary/ActuaryUtilities.jl). It should work in that case, I think (though not 100% sure).

---

<div class="post-metadata">

**Author:** ![zweiglimmergneis](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/zweiglimmergneis/32/7892_2.png) [@zweiglimmergneis](https://discourse.julialang.org/u/zweiglimmergneis)\
**Post date:** [April 13, 2021, 7:44pm UTC](https://discourse.julialang.org/t/using-julias-clipboard-function-with-numerical-data-in-columns/59223/3 "2021-04-13T19:44:27Z")

</div>

Here is my simple approach. You say it’s not practical, but it works for me. Thanks for introducing the function `clipboard` to me.

```julia
function cbtomatrix(clipboard::AbstractString)
       rowsep = "\r\n"
       # add +1 if there is no row separator at the end (see example)
       nrows = length(findall(rowsep, clipboard)) + 1
       data = parse.(Float64, split(clipboard))
       return reshape(data, nrows, :)
end

```

---

<div class="post-metadata">

**Author:** ![rafael.guerra](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rafael.guerra/32/216610_2.png) [@rafael.guerra](https://discourse.julialang.org/u/rafael.guerra)\
**Post date:** [April 13, 2021, 7:49pm UTC](https://discourse.julialang.org/t/using-julias-clipboard-function-with-numerical-data-in-columns/59223/4 "2021-04-13T19:49:42Z")

</div>

@zweiglimmergneis, brilliant.  
With your function it becomes totally convenient 🙂  
_ **NB:** we need to add +1 to nrows:_  
`nrows = length(findall(rowsep, clipboard)) + 1`

---

<div class="post-metadata">

**Author:** ![zweiglimmergneis](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/zweiglimmergneis/32/7892_2.png) [@zweiglimmergneis](https://discourse.julialang.org/u/zweiglimmergneis)\
**Post date:** [April 13, 2021, 7:56pm UTC](https://discourse.julialang.org/t/using-julias-clipboard-function-with-numerical-data-in-columns/59223/5 "2021-04-13T19:56:39Z")

</div>

Yes, the clipboard may or may not have a row separator at the end.

---

<div class="post-metadata">

**Author:** ![rafael.guerra](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rafael.guerra/32/216610_2.png) [@rafael.guerra](https://discourse.julialang.org/u/rafael.guerra)\
**Post date:** [April 13, 2021, 8:08pm UTC](https://discourse.julialang.org/t/using-julias-clipboard-function-with-numerical-data-in-columns/59223/6 "2021-04-13T20:08:59Z")

</div>

This one is nice too and accepts both comma-separated and spaces-separated clipboard data:

```julia
function clip2m()
    str = split(clipboard(), "\r\n")
    str = replace.(str, "," => " ")
    nr, nc = length(str), length(split(str[1]))
    [parse(Float64,split(str[i])[j]) for i in 1:nr, j in 1:nc]
end

# copy columnar data (comma- or space-separated) to clipboard then run:
julia> clip2m()
4×2 Matrix{Float64}:
 675.7 2962.0
 636.6 2961.0
 565.9 2964.0
 517.5 2956.0

```

---

<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:** [April 13, 2021, 8:09pm UTC](https://discourse.julialang.org/t/using-julias-clipboard-function-with-numerical-data-in-columns/59223/7 "2021-04-13T20:09:17Z")

</div>

> [@rafael.guerra](#):
>
> ```julia
> julia> str = clipboard()
> "675.7 2962\r\n636.6 2961\r\n565.9 2964\r\n517.5 2956"
> 
> ```
> 
> Do we need to use Regex to parse this into a matrix of floats or there is a simpler way?

You can use the DelimitedFiles standard library to read the data into a matrix:

```julia
julia> using DelimitedFiles

julia> readdlm(IOBuffer(str))
4×2 Matrix{Float64}:
 675.7 2962.0
 636.6 2961.0
 565.9 2964.0
 517.5 2956.0

```

---

<div class="post-metadata">

**Author:** ![rafael.guerra](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rafael.guerra/32/216610_2.png) [@rafael.guerra](https://discourse.julialang.org/u/rafael.guerra)\
**Post date:** [April 13, 2021, 8:21pm UTC](https://discourse.julialang.org/t/using-julias-clipboard-function-with-numerical-data-in-columns/59223/8 "2021-04-13T20:21:56Z")

</div>

@stevengj, thanks for this method.  
Is it possible to instruct readdlm to accept both space delimited and comma separated data?

_ **NB:** edited clip2m() function above to accept both of these inputs._

---

<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:** [April 13, 2021, 8:40pm UTC](https://discourse.julialang.org/t/using-julias-clipboard-function-with-numerical-data-in-columns/59223/9 "2021-04-13T20:40:29Z")

</div>

> [@rafael.guerra](#):
>
> Is it possible to instruct readdlm to accept both space delimited and comma separated data?

If they are different inputs, just use the `delim` parameter to specify the delimiter. If you have a single input that uses both comma and space separators (or you don’t know whether it is using commas or spaces), no; you’d have to preprocess the input with `replace(inputstring, ','=>' ')` or similar AFAIK.

---

<div class="post-metadata">

**Author:** ![rafael.guerra](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rafael.guerra/32/216610_2.png) [@rafael.guerra](https://discourse.julialang.org/u/rafael.guerra)\
**Post date:** [January 18, 2022, 6:22am UTC](https://discourse.julialang.org/t/using-julias-clipboard-function-with-numerical-data-in-columns/59223/10 "2022-01-18T06:22:52Z")

</div>

After revising this problem, @stevengj’s solution using DelimitedFiles seems to be the most robust:

```julia
clip2m() = readdlm(IOBuffer(replace(clipboard(), ','=>' ')))

```

It is already added to my startup.jl

---

<div class="post-metadata">

**Author:** ![nilshg](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/nilshg/32/2283_2.png) [@nilshg](https://discourse.julialang.org/u/nilshg)\
**Post date:** [January 18, 2022, 8:36am UTC](https://discourse.julialang.org/t/using-julias-clipboard-function-with-numerical-data-in-columns/59223/11 "2022-01-18T08:36:17Z")

</div>

@pdeffebach has since created a dedicated package for this:

[https://github.com/pdeffebach/ClipData.jl](https://github.com/pdeffebach/ClipData.jl)

---

<div class="post-metadata">

**Author:** ![lawless-m](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/lawless-m/32/30869_2.png) [@lawless-m](https://discourse.julialang.org/u/lawless-m)\
**Post date:** [January 18, 2022, 9:58am UTC](https://discourse.julialang.org/t/using-julias-clipboard-function-with-numerical-data-in-columns/59223/12 "2022-01-18T09:58:38Z")

</div>

until you introduce locales into the clipboard

1,000 10  
2,000 20

---

<div class="post-metadata">

**Author:** ![rafael.guerra](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rafael.guerra/32/216610_2.png) [@rafael.guerra](https://discourse.julialang.org/u/rafael.guerra)\
**Post date:** [January 18, 2022, 10:04am UTC](https://discourse.julialang.org/t/using-julias-clipboard-function-with-numerical-data-in-columns/59223/13 "2022-01-18T10:04:57Z")

</div>

Yes, but that can be trivially handled at the source (jEdit, Excel, etc.). The great usefulness of this is to quickly and easily get the data into a Julia matrix for further processing, plotting, etc. In particular when working on 2 machines with a remote desktop connection, where the clipboard communicates across.

---

<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:** [January 18, 2022, 1:47pm UTC](https://discourse.julialang.org/t/using-julias-clipboard-function-with-numerical-data-in-columns/59223/14 "2022-01-18T13:47:43Z")

</div>

ClipData.jl allows passing all the same keyword arguments as `CSV.read`, so you should have lots of customization for odd formatting.
