1"use strict";(self.webpackChunkgatsby_starter_default=self.webpackChunkgatsby_starter_default||[]).push([[1875],{93293:function(n,s,a){a.r(s),a.d(s,{Head:function(){return _},default:function(){return y}});var t=a(28453),e=a(96540);function p(n){const s=Object.assign({p:"p",a:"a",h1:"h1",span:"span",blockquote:"blockquote"},(0,t.R)(),n.components);return e.createElement(e.Fragment,null,e.createElement(s.p,null,"A couple weeks ago, I wrote a popular article, ",e.createElement(s.a,{href:"http://www.railsonmaui.com/blog/2014/08/17/pry-ruby-and-fun-with-the-hash-constructor/"},"Pry, Ruby, and Fun With\nthe Hash\nConstructor"),"\ndemonstrating the usefulness of ",e.createElement(s.a,{href:"https://github.com/pry/pry"},"pry")," with\nthe ",e.createElement(s.a,{href:"http://ruby-doc.org/core-2.1.2/Hash.html"},"Hash bracket\nconstructor"),". I just ran into\na super fun test example of pry that I couldn't resist sharing!"),"\n",e.createElement(s.h1,{id:"the-task-convert-csv-file-without-headers-to-array-of-hashes",style:{position:"relative"}},e.createElement(s.a,{href:"#the-task-convert-csv-file-without-headers-to-array-of-hashes","aria-label":"the task convert csv file without headers to array of hashes permalink",className:"anchor before"},e.createElement(s.span,{dangerouslySetInnerHTML:{__html:'<svg aria-hidden="true" height="20" version="1.1" viewBox="0 0 16 16" width="20"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg>'}})),"The Task: Convert CSV File without Headers to Array of Hashes"),"\n",e.createElement(s.p,null,"For example, you want to take a csv file like:"),"\n",e.createElement(s.span,{dangerouslySetInnerHTML:{__html:'<div class="gatsby-highlight" data-language="example"><pre class="language-example"><code class="language-example">|---+--------+--------|\n| 1 | Justin | Gordon |\n| 2 | Tender | Love |\n|---+--------+--------|</code></pre></div>'}}),"\n",e.createElement(s.p,null,'And create an array of hashes like this with column headers "id",\n"first_name", "last_name":'),"\n",e.createElement(s.span,{dangerouslySetInnerHTML:{__html:'<div class="gatsby-highlight" data-language="ruby"><pre class="language-ruby"><code class="language-ruby"><span class="token punctuation">[</span>\n <span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token punctuation">{</span>\n <span class="token string-literal"><span class="token string">"id,"</span></span> <span class="token operator">=></span> <span class="token string-literal"><span class="token string">"1"</span></span><span class="token punctuation">,</span>\n <span class="token string-literal"><span class="token string">"first_name"</span></span> <span class="token operator">=></span> <span class="token string-literal"><span class="token string">"Justin"</span></span><span class="token punctuation">,</span>\n <span class="token string-literal"><span class="token string">"last_name"</span></span> <span class="token operator">=></span> <span class="token string-literal"><span class="token string">"Gordon"</span></span>\n <span class="token punctuation">}</span><span class="token punctuation">,</span>\n <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token punctuation">{</span>\n <span class="token string-literal"><span class="token string">"id,"</span></span> <span class="token operator">=></span> <span class="token string-literal"><span class="token string">"2"</span></span><span class="token punctuation">,</span>\n <span class="token string-literal"><span class="token string">"first_name"</span></span> <span class="token operator">=></span> <span class="token string-literal"><span class="token string">"Tender"</span></span><span class="token punctuation">,</span>
1\n <span class="token string-literal"><span class="token string">"last_name"</span></span> <span class="token operator">=></span> <span class="token string-literal"><span class="token string">"Love"</span></span>\n <span class="token punctuation">}</span>\n<span class="token punctuation">]</span></code></pre></div>'}}),"\n",e.createElement(s.p,null,"You'd think that you could just pass the headers to the ",e.createElement(s.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">CSV.parse</code>'}}),", but\nthat doesn't work:"),"\n",e.createElement(s.span,{dangerouslySetInnerHTML:{__html:'<div class="gatsby-highlight" data-language="ruby"><pre class="language-ruby"><code class="language-ruby"><span class="token punctuation">[</span><span class="token number">11</span><span class="token punctuation">]</span> <span class="token punctuation">(</span>pry<span class="token punctuation">)</span> main<span class="token operator">:</span> <span class="token number">0</span><span class="token operator">></span> col_headers <span class="token operator">=</span> <span class="token string-literal"><span class="token string">%w(id, first_name last_name)</span></span>\n<span class="token punctuation">[</span>\n <span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token string-literal"><span class="token string">"id,"</span></span><span class="token punctuation">,</span>\n <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token string-literal"><span class="token string">"first_name"</span></span><span class="token punctuation">,</span>\n <span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token string-literal"><span class="token string">"last_name"</span></span>\n<span class="token punctuation">]</span>\n<span class="token punctuation">[</span><span class="token number">12</span><span class="token punctuation">]</span> <span class="token punctuation">(</span>pry<span class="token punctuation">)</span> main<span class="token operator">:</span> <span class="token number">0</span><span class="token operator">></span> csv <span class="token operator">=</span> <span class="token constant">CSV</span><span class="token punctuation">.</span>parse<span class="token punctuation">(</span>csv_string<span class="token punctuation">,</span> <span class="token symbol">headers</span><span class="token operator">:</span> col_headers<span class="token punctuation">)</span>\n<span class="token punctuation">(</span>pry<span class="token punctuation">)</span> output error<span class="token operator">:</span> <span class="token comment">#<NoMethodError: undefined method `table\' for #<Object:0x007fdbfc8d5588>></span></code></pre></div>'}}),"\n","\n",e.createElement(s.h1,{id:"using-arrayzip",style:{position:"relative"}},e.createElement(s.a,{href:"#using-arrayzip","aria-label":"using arrayzip permalink",className:"anchor before"},e.createElement(s.span,{dangerouslySetInnerHTML:{__html:'<svg aria-hidden="true" height="20" version="1.1" viewBox="0 0 16 16" width="20"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg>'}})),"Using Array#zip"),"\n",e.createElement(s.p,null,"I stumbled upon a note about the CSV parser that suggested using\n",e.createElement(s.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">Array#zip</code>'}})," to add keys to the results created by the CSV parser when\nheaders don't exist in the file."),"\n",e.createElement(s.p,null,"Using ",e.createElement(s.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">Array#zip</code>'}}),"? What the heck is the ",e.createElement(s.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">zip</code>'}})," method? Compression?"),"\n",e.createElement(s.span,{dangerouslySetInnerHTML:{__html:'<div class="gatsby-highlight" data-language="ruby"><pre class="language-ruby"><code class="language-ruby"><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token punctuation">(</span>pry<span class="token punctuation">)</span> main<span class="token operator">:</span> <span class="token number">0</span><span class="token operator">></span> <span class="token operator">?</span> a_array<span class="token punctuation">.</span>zip\n\n<span class="token symbol">From</span><span class="token operator">:</span> array<span class="token punctuation">.</span>c <span class="token punctuation">(</span><span class="token constant">C</span> <span class="token builtin">Method</span><span class="token punctuation">)</span><span class="token operator">:</span>\n<span class="token symbol">
1Owner</span><span class="token operator">:</span> <span class="token builtin">Array</span>\n<span class="token symbol">Visibility</span><span class="token operator">:</span> <span class="token keyword">public</span>\n<span class="token symbol">Signature</span><span class="token operator">:</span> zip<span class="token punctuation">(</span><span class="token operator">*</span>arg1<span class="token punctuation">)</span>\nNumber of lines<span class="token operator">:</span> <span class="token number">17</span>\n\nConverts any arguments to arrays<span class="token punctuation">,</span> <span class="token keyword">then</span> merges elements of <span class="token keyword">self</span> with\ncorresponding elements from <span class="token keyword">each</span> argument<span class="token punctuation">.</span>\n\nThis generates a sequence of ary<span class="token punctuation">.</span>size _n_<span class="token operator">-</span>element arrays<span class="token punctuation">,</span>\nwhere _n_ is one more than the count of arguments<span class="token punctuation">.</span>\n\nIf the size of any argument is less than the size of the initial array<span class="token punctuation">,</span>\n<span class="token keyword">nil</span> values are supplied<span class="token punctuation">.</span>\n\nIf a block is given<span class="token punctuation">,</span> it is invoked <span class="token keyword">for</span> <span class="token keyword">each</span> output array<span class="token punctuation">,</span> otherwise an\narray of arrays is returned<span class="token punctuation">.</span>\n\n a <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token number">4</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">6</span> <span class="token punctuation">]</span>\n b <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token number">7</span><span class="token punctuation">,</span> <span class="token number">8</span><span class="token punctuation">,</span> <span class="token number">9</span> <span class="token punctuation">]</span>\n <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">]</span><span class="token punctuation">.</span>zip<span class="token punctuation">(</span>a<span class="token punctuation">,</span> b<span class="token punctuation">)</span> <span class="token comment">#=> [[1, 4, 7], [2, 5, 8], [3, 6, 9]]</span>\n <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">.</span>zip<span class="token punctuation">(</span>a<span class="token punctuation">,</span> b<span class="token punctuation">)</span> <span class="token comment">#=> [[1, 4, 7], [2, 5, 8]]</span>\n a<span class="token punctuation">.</span>zip<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token number">8</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token comment">#=> [[4, 1, 8], [5, 2, nil], [6, nil, nil]]</span></code></pre></div>'}}),"\n",e.createElement(s.p,null,"Hmmmmâ¦.Why would that be useful?"),"\n",e.createElement(s.p,null,"Here's some pry command that demonstrate this. I encourage you to follow\nalong in pry!"),"\n",e.createElement(s.p,null,"I first created a CSV string from hand like this:"),"\n",e.createElement(s.span,{dangerouslySetInnerHTML:{__html:'<div class="gatsby-highlight" data-language="ruby"><pre class="language-ruby"><code class="language-ruby"><span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token punctuation">(</span>pry<span class="token punctuation">)</span> main<span class="token operator">:</span> <span class="token number">0</span><span class="token operator">></span> csv_file <span class="token operator">=</span> <span class="token string-literal heredoc-string"><span class="token delimiter"><span class="token punctuation"><<-</span><span class="token symbol">CSV</span></span><span class="token string">\n[2] (pry) main: 0* 1, "Justin", "Gordon"\n[2] (pry) main: 0* 2, "Avdi", "Grimm"\n[2] (pry) main: 0* CSV\n"1, \\"Justin\\", \\"Gordon\\"\\n2, \\"Avdi\\", \\"Grimm\\"\\n"\n[3] (pry) main: 0> CSV.parse(csv_file) { |csv_row| p csv_row }\n</span><span class="token delimiter"><span class="token symbol">CSV</span></span></span><span class="token double-colon punctuation">::</span>MalformedCSVError<span class="token operator">:</span> Illegal quoting <span class="token keyword">in</span> line <span class="token number">1.</span>\nfrom <span class="token operator">/</span>Users<span class="token regex-literal"><span class="token regex">/justin/</span></span><span class="token punctuation">.</span>rvm<span class="token operator">/</span>rubies<span class="token operator">/</span>ruby<span class="token operator">-</span><span class="token number">2.1</span><span class="token number">.2</span><span class="token operator">/</span>lib<span class="token operator">/</span>ruby<span class="token operator">/</span><span class="token number">2.1</span><span class="token number">.0</span><span class="token operator">/</span>csv<span class="token punctuation">.</span>rb<span class="token operator">:</span><span class="token number">1855</span><span class="token symbol">:in</span> `block <span class="token punctuation">(</span><span class="token number">2</span> levels<span class="token punctuation">)</span> <span class="token keyword">in</span> shift\'</code></pre></div>'}}),"\n",e.createElement(s.p,null,"Doooh!!!! That taught me that creating a legit CSV string is not as\neasy as it sounds."),"\n",e.createElement(s.p,null,"Let's create a legit csv string:"),"\n",e.createElement(s.span,{dangerouslySetInnerHTML:{__html:'<div class="gatsby-highlight" data-language="ruby"><pre class="language-ruby"><code class="language-ruby"><span class="token punctuation">[</span><span class="token number">4</span><span class="token punctuation">]</span> <span class="token punctuation">(</span>pry<span class="token punctuation">)</span> main<span class="token operator">:</span> <span class="token number">0</span><span class="token operator">></span> csv_string <span class="token operator">=</span> <span class="token constant">CSV</span><span class="token punctuation">.</span>generate <span class="token keyword">do</span> <span class="token operator">|</span>csv<span class="token operator">|</span>\n<span class="token punctuation">[</span><span class="token number">4</span><span class="token punctuation">]</span> <span class="token punctuation">(</span>pry<span class="token punctuation">)</span> main<span class="token operator">:</span> <span class="token number">0</span><span class="token operator">*</span> csv <span class="token operator"><<</span> <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token string-literal"><span class="token string">"Justin"</span></span><span class="token punctuation">,</span> <span class="token string-literal"><span class="token string">"Gordon"</span></span><span class="token punctuation">]</span>\n<span class="token punctuation">[</span><span class="token number">4</span><span class="token punctuation">]</span> <span class="token punctuation">(</span>pry<span class="token punctuation">)</span> main<span class="token operator">:</span> <span class="token number">0</span><span class="token operator">*</span> csv <span class="token operator"><<</span> <span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">,</span> <span class="token string-literal"><span class="token string">"Tender"</span></span><span class="token punctuation">,</span> <span class="token string-literal"><span class="token string">"Love"</span></span><span class="token punctuation">]</span>\n<span class="token punctuation">[</span><span class="token number">4</span><span class="token punctuation">]</span> <span class="token punctuation">(</span>pry<span class="token punctuation">)</span> main<span class="token operator">:</span> <span class="token number">0</span><span class="token operator">*</span> <span class="token keyword">end</span>\n<span class="token string-literal"><span class="token string">"1,Justin,Gordon\\n2,Tender,Love\\n"</span></span></code></pre></div>'}}),"\n",e.createElement(s.p,null,"Notice, there's no quotes around the single word names!"),"\n",e.createElement(s.p,null,"If I use CSV to parse this, we get the reverse result, the array of\narrays, back:"),"\n",e.createElement(s.span,{dangerouslySetInnerHTML:{__html:'<div class="gatsby-highlight" data-language="ruby"><pre class="language-ruby"><code class="language-ruby"><span class="token punctuation">[</span><span class="token number">16</span><span class="token punctuation">]</span> <span class="token punctuation">(</span>pry<span class="token punctuation">)</span> main<span class="token operator">:</span> <span class="token number">0</span><span class="token operator">></span> <span class="token constant">CSV</span><span class="token punctuation">.</span>parse<span class="token punctuation">(</span>csv_string<span class="token punctuation">)</span>\n<span class="token punctuation">[</span>\n <span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token punctuation">[</span>
1\n <span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token string-literal"><span class="token string">"1"</span></span><span class="token punctuation">,</span>\n <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token string-literal"><span class="token string">"Justin"</span></span><span class="token punctuation">,</span>\n <span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token string-literal"><span class="token string">"Gordon"</span></span>\n <span class="token punctuation">]</span><span class="token punctuation">,</span>\n <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token punctuation">[</span>\n <span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token string-literal"><span class="token string">"2"</span></span><span class="token punctuation">,</span>\n <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token string-literal"><span class="token string">"Tender"</span></span><span class="token punctuation">,</span>\n <span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token string-literal"><span class="token string">"Love"</span></span>\n <span class="token punctuation">]</span>\n<span class="token punctuation">]</span>\n<span class="token punctuation">[</span><span class="token number">17</span><span class="token punctuation">]</span> <span class="token punctuation">(</span>pry<span class="token punctuation">)</span> main<span class="token operator">:</span> <span class="token number">0</span><span class="token operator">></span> <span class="token constant">CSV</span><span class="token punctuation">.</span>parse<span class="token punctuation">(</span>csv_string<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token keyword">class</span>\n<span class="token class-name">Array</span> <span class="token operator"><</span> <span class="token builtin">Object</span></code></pre></div>'}}),"\n",e.createElement(s.p,null,"Ahhâ¦Could we use the Hash[] constructor to convert these arrays into\nHashes that place the proper keys?"),"\n",e.createElement(s.span,{dangerouslySetInnerHTML:{__html:'<div class="gatsby-highlight" data-language="ruby"><pre class="language-ruby"><code class="language-ruby"><span class="token punctuation">[</span><span class="token number">18</span><span class="token punctuation">]</span> <span class="token punctuation">(</span>pry<span class="token punctuation">)</span> main<span class="token operator">:</span> <span class="token number">0</span><span class="token operator">></span> first_row <span class="token operator">=</span> <span class="token constant">CSV</span><span class="token punctuation">.</span>parse<span class="token punctuation">(</span>csv_string<span class="token punctuation">)</span><span class="token punctuation">.</span>first\n<span class="token punctuation">[</span>\n <span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token string-literal"><span class="token string">"1"</span></span><span class="token punctuation">,</span>\n <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token string-literal"><span class="token string">"Justin"</span></span><span class="token punctuation">,</span>\n <span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token string-literal"><span class="token string">"Gordon"</span></span>\n<span class="token punctuation">]</span>\n<span class="token punctuation">[</span><span class="token number">19</span><span class="token punctuation">]</span> <span class="token punctuation">(</span>pry<span class="token punctuation">)</span> main<span class="token operator">:</span> <span class="token number">0</span><span class="token operator">></span> col_headers <span class="token operator">=</span> <span class="token string-literal"><span class="token string">%w(id, first_name last_name)</span></span>\n<span class="token punctuation">[</span>\n <span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token string-literal"><span class="token string">"id,"</span></span><span class="token punctuation">,</span>\n <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token string-literal"><span class="token string">"first_name"</span></span><span class="token punctuation">,</span>\n <span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token string-literal"><span class="token string">"last_name"</span></span>\n<span class="token punctuation">]</span>\n<span class="token punctuation">[</span><span class="token number">20</span><span class="token punctuation">]</span> <span class="token punctuation">(</span>pry<span class="token punctuation">)</span> main<span class="token operator">:</span> <span class="token number">0</span><span class="token operator">></span> first_row<span class="token punctuation">.</span>zip<span class="token punctuation">(</span>col_headers<span class="token punctuation">)</span>\n<span class="token punctuation">[</span>\n <span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token punctuation">[</span>
1\n <span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token string-literal"><span class="token string">"1"</span></span><span class="token punctuation">,</span>\n <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token string-literal"><span class="token string">"id,"</span></span>\n <span class="token punctuation">]</span><span class="token punctuation">,</span>\n <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token punctuation">[</span>\n <span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token string-literal"><span class="token string">"Justin"</span></span><span class="token punctuation">,</span>\n <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token string-literal"><span class="token string">"first_name"</span></span>\n <span class="token punctuation">]</span><span class="token punctuation">,</span>\n <span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token punctuation">[</span>\n <span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token string-literal"><span class="token string">"Gordon"</span></span><span class="token punctuation">,</span>\n <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token string-literal"><span class="token string">"last_name"</span></span>\n <span class="token punctuation">]</span>\n<span class="token punctuation">]</span>\n<span class="token punctuation">[</span><span class="token number">21</span><span class="token punctuation">]</span> <span class="token punctuation">(</span>pry<span class="token punctuation">)</span> main<span class="token operator">:</span> <span class="token number">0</span><span class="token operator">></span> <span class="token builtin">Hash</span><span class="token punctuation">[</span> first_row<span class="token punctuation">.</span>zip<span class="token punctuation">(</span>col_headers<span class="token punctuation">)</span> <span class="token punctuation">]</span>\n<span class="token punctuation">{</span>\n <span class="token string-literal"><span class="token string">"1"</span></span> <span class="token operator">=></span> <span class="token string-literal"><span class="token string">"id,"</span></span><span class="token punctuation">,</span>\n <span class="token string-literal"><span class="token string">"Justin"</span></span> <span class="token operator">=></span> <span class="token string-literal"><span class="token string">"first_name"</span></span><span class="token punctuation">,</span>\n <span class="token string-literal"><span class="token string">"Gordon"</span></span> <span class="token operator">=></span> <span class="token string-literal"><span class="token string">"last_name"</span></span>\n<span class="token punctuation">}</span></code></pre></div>'}}),"\n",e.createElement(s.p,null,"Bingo!"),"\n",e.createElement(s.p,null,"Now, let's fix the array of arrays, creating an array called ",e.createElement(s.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">rows</code>'}})),"\n",e.createElement(s.span,{dangerouslySetInnerHTML:{__html:'<div class="gatsby-highlight" data-language="ruby"><pre class="language-ruby"><code class="language-ruby"><span class="token punctuation">[</span><span class="token number">22</span><span class="token punctuation">]</span> <span class="token punctuation">(</span>pry<span class="token punctuation">)</span> main<span class="token operator">:</span> <span class="token number">0</span><span class="token operator">></span> rows <span class="token operator">=</span> <span class="token constant">CSV</span><span class="token punctuation">.</span>parse<span class="token punctuation">(</span>csv_string<span class="token punctuation">)</span>\n<span class="token punctuation">[</span>\n <span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token punctuation">[</span>
1\n <span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token string-literal"><span class="token string">"1"</span></span><span class="token punctuation">,</span>\n <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token string-literal"><span class="token string">"Justin"</span></span><span class="token punctuation">,</span>\n <span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token string-literal"><span class="token string">"Gordon"</span></span>\n <span class="token punctuation">]</span><span class="token punctuation">,</span>\n <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token punctuation">[</span>\n <span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token string-literal"><span class="token string">"2"</span></span><span class="token punctuation">,</span>\n <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token string-literal"><span class="token string">"Tender"</span></span><span class="token punctuation">,</span>\n <span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token string-literal"><span class="token string">"Love"</span></span>\n <span class="token punctuation">]</span>\n<span class="token punctuation">]</span></code></pre></div>'}}),"\n",e.createElement(s.p,null,"Then the grand finale!"),"\n",e.createElement(s.span,{dangerouslySetInnerHTML:{__html:'<div class="gatsby-highlight" data-language="ruby"><pre class="language-ruby"><code class="language-ruby"><span class="token punctuation">[</span><span class="token number">24</span><span class="token punctuation">]</span> <span class="token punctuation">(</span>pry<span class="token punctuation">)</span> main<span class="token operator">:</span> <span class="token number">0</span><span class="token operator">></span> rows<span class="token punctuation">.</span>map <span class="token punctuation">{</span> <span class="token operator">|</span>row<span class="token operator">|</span> <span class="token builtin">Hash</span><span class="token punctuation">[</span> col_headers<span class="token punctuation">.</span>zip<span class="token punctuation">(</span>row<span class="token punctuation">)</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span>\n<span class="token punctuation">[</span>\n <span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token punctuation">{</span>\n <span class="token string-literal"><span class="token string">"id,"</span></span> <span class="token operator">=></span> <span class="token string-literal"><span class="token string">"1"</span></span><span class="token punctuation">,</span>\n <span class="token string-literal"><span class="token string">"first_name"</span></span> <span class="token operator">=></span> <span class="token string-literal"><span class="token string">"Justin"</span></span><span class="token punctuation">,</span>\n <span class="token string-literal"><span class="token string">"last_name"</span></span> <span class="token operator">=></span> <span class="token string-literal"><span class="token string">"Gordon"</span></span>\n <span class="token punctuation">}</span><span class="token punctuation">,</span>\n <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token punctuation">{</span>\n <span class="token string-literal"><span class="token string">"id,"</span></span> <span class="token operator">=></span> <span class="token string-literal"><span class="token string">"2"</span></span><span class="token punctuation">,</span>
1\n <span class="token string-literal"><span class="token string">"first_name"</span></span> <span class="token operator">=></span> <span class="token string-literal"><span class="token string">"Tender"</span></span><span class="token punctuation">,</span>\n <span class="token string-literal"><span class="token string">"last_name"</span></span> <span class="token operator">=></span> <span class="token string-literal"><span class="token string">"Love"</span></span>\n <span class="token punctuation">}</span>\n<span class="token punctuation">]</span></code></pre></div>'}}),"\n",e.createElement(s.p,null,"And sure, you can do this all on one line by inlining the ",e.createElement(s.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">rows</code>'}}),"\nvariable:"),"\n",e.createElement(s.span,{dangerouslySetInnerHTML:{__html:'<div class="gatsby-highlight" data-language="ruby"><pre class="language-ruby"><code class="language-ruby"><span class="token constant">CSV</span><span class="token punctuation">.</span>parse<span class="token punctuation">(</span>csv_string<span class="token punctuation">)</span><span class="token punctuation">.</span>map <span class="token punctuation">{</span> <span class="token operator">|</span>row<span class="token operator">|</span> <span class="token builtin">Hash</span><span class="token punctuation">[</span> col_headers<span class="token punctuation">.</span>zip<span class="token punctuation">(</span>row<span class="token punctuation">)</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span></code></pre></div>'}}),"\n",e.createElement(s.h1,{id:"using-headers-option-in-csv",style:{position:"relative"}},e.createElement(s.a,{href:"#using-headers-option-in-csv","aria-label":"using headers option in csv permalink",className:"anchor before"},e.createElement(s.span,{dangerouslySetInnerHTML:{__html:'<svg aria-hidden="true" height="20" version="1.1" viewBox="0 0 16 16" width="20"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg>'}})),"Using headers option in CSV?"),"\n",e.createElement(s.p,null,"Well, you'd think that you could just pass the headers to the\n",e.createElement(s.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">CSV.parse</code>'}}),", but that doesn't work:"),"\n",e.createElement(s.span,{dangerouslySetInnerHTML:{__html:'<div class="gatsby-highlight" data-language="ruby"><pre class="language-ruby"><code class="language-ruby"><span class="token punctuation">[</span><span class="token number">12</span><span class="token punctuation">]</span> <span class="token punctuation">(</span>pry<span class="token punctuation">)</span> main<span class="token operator">:</span> <span class="token number">0</span><span class="token operator">></span> csv <span class="token operator">=</span> <span class="token constant">CSV</span><span class="token punctuation">.</span>parse<span class="token punctuation">(</span>csv_string<span class="token punctuation">,</span> <span class="token symbol">headers</span><span class="token operator">:</span> col_headers<span class="token punctuation">)</span>\n<span class="token punctuation">(</span>pry<span class="token punctuation">)</span> output error<span class="token operator">:</span> <span class="token comment">#<NoMethodError: undefined method `table\' for #<Object:0x007fdbfc8d5588>></span></code></pre></div>'}}),"\n",e.createElement(s.p,null,"Well, what's the doc?"),"\n",e.createElement(s.span,{dangerouslySetInnerHTML:{__html:'<div class="gatsby-highlight" data-language="ruby"><pre class="language-ruby"><code class="language-ruby"><span class="token punctuation">[</span><span class="token number">13</span><span class="token punctuation">]</span> <span class="token punctuation">(</span>pry<span class="token punctuation">)</span> main<span class="token operator">:</span> <span class="token number">0</span><span class="token operator">></span> <span class="token operator">?</span> <span class="token constant">CSV</span><span class="token punctuation">.</span>parse\n\n<span class="token symbol">From</span><span class="token operator">:</span> <span class="token operator">/</span>Users<span class="token regex-literal"><span class="token regex">/justin/</span></span><span class="token punctuation">.</span>rvm<span class="token operator">/</span>rubies<span class="token operator">/</span>ruby<span class="token operator">-</span><span class="token number">2.1</span><span class="token number">.2</span><span class="token operator">/</span>lib<span class="token operator">/</span>ruby<span class="token operator">/</span><span class="token number">2.1</span><span class="token number">.0</span><span class="token operator">/</span>csv<span class="token punctuation">.</span>rb @ line <span class="token number">1278</span><span class="token operator">:</span>\n<span class="token symbol">
1Owner</span><span class="token operator">:</span> <span class="token comment">#<Class:CSV></span>\n<span class="token symbol">Visibility</span><span class="token operator">:</span> <span class="token keyword">public</span>\n<span class="token symbol">Signature</span><span class="token operator">:</span> parse<span class="token punctuation">(</span><span class="token operator">*</span>args<span class="token punctuation">,</span> <span class="token operator">&</span>block<span class="token punctuation">)</span>\nNumber of lines<span class="token operator">:</span> <span class="token number">11</span>\n\n<span class="token symbol">:call</span><span class="token operator">-</span>seq<span class="token operator">:</span>\n parse<span class="token punctuation">(</span> str<span class="token punctuation">,</span> options <span class="token operator">=</span> <span class="token class-name">Hash</span><span class="token punctuation">.</span><span class="token keyword">new</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token operator">|</span>row<span class="token operator">|</span> <span class="token operator">...</span> <span class="token punctuation">}</span>\n parse<span class="token punctuation">(</span> str<span class="token punctuation">,</span> options <span class="token operator">=</span> <span class="token class-name">Hash</span><span class="token punctuation">.</span><span class="token keyword">new</span> <span class="token punctuation">)</span>\n\nThis method can be used to easily parse <span class="token constant">CSV</span> out of a <span class="token builtin">String</span><span class="token punctuation">.</span> You may either\nprovide a block which will be called with <span class="token keyword">each</span> row of the <span class="token builtin">String</span> <span class="token keyword">in</span> turn<span class="token punctuation">,</span>\n<span class="token keyword">or</span> just use the returned <span class="token builtin">Array</span> of Arrays <span class="token punctuation">(</span><span class="token keyword">when</span> no block is given<span class="token punctuation">)</span><span class="token punctuation">.</span>\n\nYou pass your str to read from<span class="token punctuation">,</span> <span class="token keyword">and</span> an optional options <span class="token builtin">Hash</span> containing\nanything <span class="token constant">CSV</span><span class="token double-colon punctuation">::</span><span class="token keyword">new</span><span class="token punctuation">(</span><span class="token punctuation">)</span> understands<span class="token punctuation">.</span></code></pre></div>'}}),"\n",e.createElement(s.p,null,"Hmmmâ¦seems that passing the ",e.createElement(s.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">headers</code>'}})," should have worked."),"\n",e.createElement(s.p,null,"The ",e.createElement(s.a,{href:"http://ruby-doc.org/stdlib-2.1.2/libdoc/csv/rdoc/CSV.html#method-c-new"},"CSV docs clearly\nstate"),"\nthat the initialize method takes an option ",e.createElement(s.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">:headers</code>'}})),"\n",e.createElement(s.blockquote,null,"\n",e.createElement(s.p,null,":headers If set to :first_row or true, the initial row of\nthe CSV file will be treated as a row of headers. If set to an Array,\nthe contents will be used as the headers. If set to a String, the\nString is run through a call of ::parse_line with the same\n:col_sep, :row_sep, and :quote_char as\nthis instance to produce an Array of headers. This setting causes\n#shift to return rows as CSV::Row objects instead of Arrays and\n#read to return CSV::Table objects instead of an Array of Arrays."),"\n"),"\n",e.createElement(s.p,null,"So, what can we call on a new CSV object? Let's list the methods."),"\n",e.createElement(s.span,{dangerouslySetInnerHTML:{__html:'<div class="gatsby-highlight" data-language="ruby"><pre class="language-ruby"><code class="language-ruby"><span class="token punctuation">[</span><span class="token number">25</span><span class="token punctuation">]</span> <span class="token punctuation">(</span>pry<span class="token punctuation">)</span> main<span class="token operator">:</span> <span class="token number">0</span><span class="token operator">></span> ls <span class="token class-name">CSV</span><span class="token punctuation">.</span><span class="token keyword">new</span><span class="token punctuation">(</span>csv_string<span class="token punctuation">,</span> <span class="token symbol">headers</span><span class="token operator">:</span> col_headers<span class="token punctuation">)</span>\nEnumerable<span class="token comment">#methods:</span>\n all<span class="token operator">?</span> count each_entry find group_by map minmax reject sum to_table\n any<span class="token operator">?</span>
1 cycle each_slice find_all <span class="token keyword">include</span><span class="token operator">?</span> max minmax_by reverse_each take to_text_table\n as_json detect each_with_index find_index index_by max_by none<span class="token operator">?</span> select take_while zip\n chunk drop each_with_object first inject member<span class="token operator">?</span> one<span class="token operator">?</span> slice_before to_a\n collect drop_while entries flat_map lazy min partition sort to_h\n collect_concat each_cons exclude<span class="token operator">?</span> grep many<span class="token operator">?</span> min_by reduce sort_by to_set\n<span class="token constant">CSV</span><span class="token comment">#methods:</span>\n <span class="token operator"><<</span> col_sep fcntl header_convert lineno readline skip_blanks<span class="token operator">?</span> to_io\n add_row convert field_size_limit header_converters path readlines skip_lines truncate\n binmode converters fileno header_row<span class="token operator">?</span> pid reopen stat tty<span class="token operator">?</span>\n binmode<span class="token operator">?</span> <span class="token keyword">each</span> flock headers pos return_headers<span class="token operator">?</span> string unconverted_fields<span class="token operator">?</span>\n close encoding flush inspect pos<span class="token operator">=</span> rewind sync write_headers<span class="token operator">?</span>\n close_read eof force_quotes<span class="token operator">?</span> internal_encoding puts row_sep sync<span class="token operator">=</span>\n close_write eof<span class="token operator">?</span> fsync ioctl quote_char seek tell\n closed<span class="token operator">?</span> external_encoding gets isatty read shift to_i\ninstance variables<span class="token operator">:</span>\n <span class="token variable">@col_sep</span> <span class="token variable">@field_size_limit</span> <span class="token variable">@headers</span> <span class="token variable">@parsers</span> <span class="token variable">@re_chars</span> <span class="token variable">@row_sep</span> <span class="token variable">@unconverted_fields</span>\n <span class="token variable">@converters</span> <span class="token variable">@force_quotes</span> <span class="token variable">@io</span> <span class="token variable">@quote</span> <span class="token variable">@re_esc</span> <span class="token variable">@skip_blanks</span> <span class="token variable">@use_headers</span>\n <span class="token variable">@encoding</span> <span class="token variable">@header_converters</span> <span class="token variable">@lineno</span> <span class="token variable">@quote_char</span> <span class="token variable">@return_headers</span> <span class="token variable">@skip_lines</span> <span class="token variable">@write_headers</span></code></pre></div>'}}),"\n",e.createElement(s.p,null,"How about this:"),"\n",e.createElement(s.span,{dangerouslySetInnerHTML:{__html:'<div class="gatsby-highlight" data-language="ruby"><pre class="language-ruby"><code class="language-ruby"><span class="token punctuation">[</span><span class="token number">14</span><span class="token punctuation">]</span> <span class="token punctuation">(</span>pry<span class="token punctuation">)</span> main<span class="token operator">:</span> <span class="token number">0</span><span class="token operator">></span> csv <span class="token operator">=</span> <span class="token class-name">CSV</span><span class="token punctuation">.</span><span class="token keyword">new</span><span class="token punctuation">(</span>csv_string<span class="token punctuation">,</span> <span class="token symbol">headers</span><span class="token operator">:</span> col_headers<span class="token punctuation">)</span><span class="token punctuation">.</span>to_a\n<span class="token punctuation">[</span>\n <span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token comment">#<CSV::Row "id,":"1" "first_name":"Justin" "last_name":"Gordon">,</span>\n <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token comment">#<CSV::Row "id,":"2" "first_name":"Tender" "last_name":"Love"></span>\n<span class="token punctuation">]</span></code></pre></div>'}}),"\n",e.createElement(s.p,null,"Well, that's getting closer."),"\n",e.createElement(s.p,null,"How about if I just map those rows with a ",e.createElement(s.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">to_hash</code>'}}),"?"),"\n",e.createElement(s.span,{dangerouslySetInnerHTML:{__html:'<div class="gatsby-highlight" data-language="ruby"><pre class="language-ruby"><code class="language-ruby"><span class="token punctuation">[</span><span class="token number">16</span><span class="token punctuation">]</span> <span class="token punctuation">(</span>pry<span class="token punctuation">)</span> main<span class="token operator">:</span> <span class="token number">0</span><span class="token operator">></span> csv <span class="token operator">=</span> <span class="token class-name">CSV</span><span class="token punctuation">.</span><span class="token keyword">new</span><span class="token punctuation">(</span>csv_string<span class="token punctuation">,</span> <span class="token symbol">headers</span><span class="token operator">:</span> col_headers<span class="token punctuation">)</span><span class="token punctuation">.</span>map<span class="token punctuation">(</span><span class="token operator">&</span><span class="token symbol">:to_hash</span><span class="token punctuation">)</span>\n<span class="token punctuation">[</span>\n <span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token punctuation">{</span>
1\n <span class="token string-literal"><span class="token string">"id,"</span></span> <span class="token operator">=></span> <span class="token string-literal"><span class="token string">"1"</span></span><span class="token punctuation">,</span>\n <span class="token string-literal"><span class="token string">"first_name"</span></span> <span class="token operator">=></span> <span class="token string-literal"><span class="token string">"Justin"</span></span><span class="token punctuation">,</span>\n <span class="token string-literal"><span class="token string">"last_name"</span></span> <span class="token operator">=></span> <span class="token string-literal"><span class="token string">"Gordon"</span></span>\n <span class="token punctuation">}</span><span class="token punctuation">,</span>\n <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token punctuation">{</span>\n <span class="token string-literal"><span class="token string">"id,"</span></span> <span class="token operator">=></span> <span class="token string-literal"><span class="token string">"2"</span></span><span class="token punctuation">,</span>\n <span class="token string-literal"><span class="token string">"first_name"</span></span> <span class="token operator">=></span> <span class="token string-literal"><span class="token string">"Tender"</span></span><span class="token punctuation">,</span>\n <span class="token string-literal"><span class="token string">"last_name"</span></span> <span class="token operator">=></span> <span class="token string-literal"><span class="token string">"Love"</span></span>\n <span class="token punctuation">}</span>\n<span class="token punctuation">]</span></code></pre></div>'}}),"\n",e.createElement(s.p,null,"Bingo!"),"\n",e.createElement(s.p,null,"I hope you enjoyed this!"))}var o=function(n){void 0===n&&(n={});const{wrapper:s}=Object.assign({},(0,t.R)(),n.components);return s?e.createElement(s,n,e.createElement(p,n)):p(n)},c=a(5588),l=a(65427),r=a(20504),u=a(43397),i=a(61942);const k=n=>n.replace(/\/+$/,""),m=(n,s)=>s?""+n+(s.startsWith("/")?s:"/"+s):n,g=(n,s)=>m(k(n),s),d=(n,s)=>m((n=>"undefined"!=typeof window?window.location.origin:k(n))(n),s),h=(n,s)=>{const a=(0,c.d)(s);return a?g(n,a):(n=>g(n,"/shakacode-og.png"))(n)},b=n=>{let{data:s,location:a,children:t}=n;const{frontmatter:p}=s.mdx,{siteUrl:o}=s.site.siteMetadata,c=d(o,a.pathname);return e.createElement(e.Fragment,null,e.createElement(l.A,null),e.createElement(r.A,{header:e.createElement(i.r,{breadcrumb:p.title}),main:e.createElement(e.Fragment,null,e.createElement(i.c,{body:t,title:p.title,author:p.author,date:p.date,link:c,categories:p.categories,featuredImage:p.featuredImage,showFeaturedImage:p.showFeaturedImage}),e.createElement(u.LN,null))}))};function y(n){return e.createElement(b,n,e.createElement(o,n))}const _=n=>{let{data:s,location:a}=n;const{frontmatter:t,excerpt:p}=s.mdx,{siteMetadata:o}=s.site,{siteUrl:c,title:l,description:r}=o,u=((n,s,a)=>n.excerpt||s||a)(t,p,r),i=h(c,t.featuredImage),k=g(c,a.pathname);return e.createElement(e.Fragment,null,e.createElement("title",null,t.title+" | "+l),e.createElement("link",{rel:"canonical",href:k}),e.createElement("meta",{name:"description",content:u}),e.createElement("meta",{property:"og:title",content:t.title}),e.createElement("meta",{property:"og:description",content:u}),e.createElement("meta",{property:"og:type",content:"article"}),e.createElement("meta",{property:"og:url",content:k}),e.createElement("meta",{property:"og:image",content:i}),e.createElement("meta",{name:"image",content:i}),e.createElement("meta",{name:"twitter:card",content:"summary_large_image"}),e.createElement("meta",{name:"twitter:title",content:t.title}),e.createElement("meta",{name:"twitter:description",content:u}),e.createElement("meta",{name:"twitter:image",content:i}))}}}]); 2//# sourceMappingURL=component---src-template-blog-article-tsx-content-file-path-src-posts-pry-ruby-array-zip-csv-and-the-hash-constructor-index-mdx-014d49401e0954a05a10.js.map
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.