https://bugs.ruby-lang.org/https://bugs.ruby-lang.org/favicon.ico?17113305112014-07-07T13:05:51ZRuby Issue Tracking SystemRuby master - Bug #10013: [CSV] Yielding all elements from a rowhttps://bugs.ruby-lang.org/issues/10013?journal_id=476352014-07-07T13:05:51ZGat (Dawid Janczak)dawid.janczak@gmail.com
<ul></ul><p>Sorry, this should be in lib category, but I'm not able to change it now.</p> Ruby master - Bug #10013: [CSV] Yielding all elements from a rowhttps://bugs.ruby-lang.org/issues/10013?journal_id=476382014-07-07T17:09:56Zavit (Andrew Vit)andrew@avit.ca
<ul></ul><p>Do you mean that it should consider the block arity to decide whether to yield a Row or destructure it into column parts? i.e.</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="no">CSV</span><span class="p">.</span><span class="nf">foreach</span><span class="p">(</span><span class="s1">'file.csv'</span><span class="p">,</span> <span class="ss">headers: </span><span class="kp">true</span><span class="p">)</span> <span class="k">do</span> <span class="o">|</span><span class="n">col1</span><span class="p">,</span> <span class="n">col2</span><span class="p">,</span> <span class="n">col3</span><span class="o">|</span>
<span class="n">col1</span> <span class="o">==</span> <span class="s2">"1"</span>
<span class="n">col2</span> <span class="o">==</span> <span class="s2">"2"</span>
<span class="n">col3</span> <span class="o">==</span> <span class="s2">"3"</span>
<span class="k">end</span>
</code></pre>
<p>and also</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="no">CSV</span><span class="p">.</span><span class="nf">foreach</span><span class="p">(</span><span class="s1">'file.csv'</span><span class="p">,</span> <span class="ss">headers: </span><span class="kp">true</span><span class="p">)</span> <span class="k">do</span> <span class="o">|</span><span class="n">row</span><span class="o">|</span>
<span class="n">row</span><span class="p">[</span><span class="s2">"col1"</span><span class="p">]</span> <span class="o">==</span> <span class="s2">"1"</span>
<span class="n">row</span><span class="p">[</span><span class="s2">"col2"</span><span class="p">]</span> <span class="o">==</span> <span class="s2">"2"</span>
<span class="n">row</span><span class="p">[</span><span class="s2">"col3"</span><span class="p">]</span> <span class="o">==</span> <span class="s2">"3"</span>
<span class="k">end</span>
</code></pre>
<p>I think this would be too confusing and magical. What to do when the block arity doesn't match the count of row items? What about the case of a CSV with one column?</p>
<p>I haven't tried, but this might do what you expect (if you must use headers in the input):</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="no">CSV</span><span class="p">.</span><span class="nf">foreach</span><span class="p">(</span><span class="s1">'file.csv'</span><span class="p">,</span> <span class="ss">headers: </span><span class="kp">true</span><span class="p">).</span><span class="nf">lazy</span><span class="p">.</span><span class="nf">map</span><span class="p">(</span><span class="o">&</span><span class="ss">:to_a</span><span class="p">).</span><span class="nf">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">col1</span><span class="p">,</span> <span class="n">col2</span><span class="p">,</span> <span class="n">col3</span><span class="o">|</span>
<span class="n">col1</span> <span class="o">==</span> <span class="s2">"1"</span>
<span class="n">col2</span> <span class="o">==</span> <span class="s2">"2"</span>
<span class="n">col3</span> <span class="o">==</span> <span class="s2">"3"</span>
<span class="k">end</span>
</code></pre>
<p>I'll leave it for someone else to chime in whether there's a case for a special method here (e.g. "foreach_array").</p> Ruby master - Bug #10013: [CSV] Yielding all elements from a rowhttps://bugs.ruby-lang.org/issues/10013?journal_id=479372014-07-20T19:28:44Zhsbt (Hiroshi SHIBATA)hsbt@ruby-lang.org
<ul><li><strong>Category</strong> set to <i>lib</i></li><li><strong>Status</strong> changed from <i>Open</i> to <i>Assigned</i></li><li><strong>Assignee</strong> set to <i>JEG2 (James Gray)</i></li><li><strong>Target version</strong> set to <i>2.2.0</i></li></ul> Ruby master - Bug #10013: [CSV] Yielding all elements from a rowhttps://bugs.ruby-lang.org/issues/10013?journal_id=481112014-07-28T14:32:18ZGat (Dawid Janczak)dawid.janczak@gmail.com
<ul></ul><p>First of all sorry for the late answer Andrew.</p>
<p>Checking arity was one thing I was considering. You're right that the arity of the block might not match the number of items, but that works fine with arrays.</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="n">foo</span> <span class="o">=</span> <span class="p">[[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">],</span> <span class="p">[</span><span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">]]</span>
<span class="n">foo</span><span class="p">.</span><span class="nf">each</span> <span class="p">{</span> <span class="o">|</span><span class="n">el</span><span class="o">|</span> <span class="nb">p</span> <span class="n">el</span> <span class="p">}</span> <span class="c1"># => prints [1, 2] then [3, 4]</span>
<span class="n">foo</span><span class="p">.</span><span class="nf">each</span> <span class="p">{</span> <span class="o">|</span><span class="n">el1</span><span class="p">,</span> <span class="n">el2</span><span class="o">|</span> <span class="nb">p</span> <span class="n">el2</span> <span class="p">}</span> <span class="c1"># => prints 2 then 4</span>
<span class="n">foo</span><span class="p">.</span><span class="nf">each</span> <span class="p">{</span> <span class="o">|</span><span class="n">el1</span><span class="p">,</span> <span class="n">el2</span><span class="p">,</span> <span class="n">el3</span><span class="o">|</span> <span class="nb">p</span> <span class="n">el3</span> <span class="p">}</span> <span class="c1"># => prints nil then nil</span>
</code></pre>
<p>This is basically the same behaviour as parallel assignment with more LVals than RVals.</p>
<p>Another thing I was considering was to always yield CSV::Row objects.</p> Ruby master - Bug #10013: [CSV] Yielding all elements from a rowhttps://bugs.ruby-lang.org/issues/10013?journal_id=693312018-01-05T21:01:16Znaruse (Yui NARUSE)naruse@airemix.jp
<ul><li><strong>Target version</strong> deleted (<del><i>2.2.0</i></del>)</li></ul> Ruby master - Bug #10013: [CSV] Yielding all elements from a rowhttps://bugs.ruby-lang.org/issues/10013?journal_id=708872018-03-08T07:33:43Zmame (Yusuke Endoh)mame@ruby-lang.org
<ul><li><strong>Assignee</strong> changed from <i>JEG2 (James Gray)</i> to <i>kou (Kouhei Sutou)</i></li></ul><p><a class="user active user-mention" href="https://bugs.ruby-lang.org/users/32">@kou (Kouhei Sutou)</a>, could you check this ticket?</p> Ruby master - Bug #10013: [CSV] Yielding all elements from a rowhttps://bugs.ruby-lang.org/issues/10013?journal_id=709382018-03-10T09:02:30Zkou (Kouhei Sutou)kou@cozmixng.org
<ul><li><strong>Status</strong> changed from <i>Assigned</i> to <i>Closed</i></li></ul><p>Thanks for your report.<br>
I've fixed it at master: <a href="https://github.com/ruby/csv/commit/71d66af9824e4a30ed616668fc4ce8d9b68a5026" class="external">https://github.com/ruby/csv/commit/71d66af9824e4a30ed616668fc4ce8d9b68a5026</a></p>