Thread overview
Selected elements from splitter output
May 04, 2021
Chris Piker
May 04, 2021
Ali Çehreli
May 04, 2021
Ali Çehreli
May 05, 2021
Chris Piker
May 04, 2021
Hi D

I have a white-space delimited file with quite a few columns, but I only care about columns 0, 2, 3, 4, 8, 9, 10.  Since I don't need most of the 60+ columns it seemed like:

   std.algorithm.iteration.splitter()

would be a better function to use then std.array.split().  My problem is that I don't know how to get the elements I care about from the splitter, for example:

char[] line;
char[][] cols_needed;
while(file.readln(line)){
   auto a = line.splitter()
   cols_needed = ???
}

On a related note, are there any standard library functions that select specific elements of a range by index without a loop?  So the logical equivalent of:

auto string_range
char[][] wanted = string_range.get( [1, 5, 7] );  // pseudo-code element selection

It's not a big deal if there's not something standard.

Thanks for the help,

May 04, 2021
On 5/4/21 1:40 PM, Chris Piker wrote:

> I only care about columns 0, 2, 3, 4, 8, 9, 10.

That's std.range.stride.

> char[][] wanted = string_range.get( [1, 5, 7] );  // pseudo-code element

That's std.range.indexed.

import std.range;
import std.stdio;

void main() {
  auto r = 10.iota.stride(2);
  writeln(r);

  writeln(r.indexed([1, 3]));

  // Note: The above works only because 'stride' applies
  // "design by introspection" (DbI) and is able to work as a
  // RandomAccessRanges. Not every range can do that; so, in a more
  // general case, you would have to turn your range to a
  // RandomAccessRange by calling std.array.array first:
  auto r2 = r.array;
  // The following can work with any InputRange only after doing that.
  writeln(r2.indexed([1, 3]));
}

Ali

May 04, 2021
On 5/4/21 3:02 PM, Ali Çehreli wrote:

>    // Note: The above works only because 'stride' applies
>    // "design by introspection" (DbI) and is able to work as a
>    // RandomAccessRanges.

Ok, I was too enthusiastic there. The RandomAccessRange'ness of the input range changes how efficient stride() works but we can't say DbI is used there.

Ali


May 05, 2021
On Tuesday, 4 May 2021 at 22:02:11 UTC, Ali Çehreli wrote:
> On 5/4/21 1:40 PM, Chris Piker wrote:
>
> > I only care about columns 0, 2, 3, 4, 8, 9, 10.
>
> That's std.range.stride.
>
> > char[][] wanted = string_range.get( [1, 5, 7] );  //
> pseudo-code element
>
> That's std.range.indexed.

Hey Thanks!

And even more, thanks for the book.  It's very well organized.  I keep a paper copy of "Programming in D" open on my desk all the time these days.  Looking forward to getting a few copies for work once we're back in the office.