Thread overview
Real simple question... for good programmers
Oct 22, 2022
WhatMeWorry
Oct 22, 2022
Enjoys Math
Oct 22, 2022
Ali Çehreli
Oct 22, 2022
Enjoys Math
Oct 23, 2022
Paul Backus
October 22, 2022

string[] tokens = userSID.output.split!isWhite;
writeln("tokens = ", tokens);

tokens = ["SID", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "S-1-5-21-3823976785-3597194045-4221507747-1779", "", "", "", "", "", "", "", ""]

Is there a clever way that I can discard all the extra null strings in the resultant string array?

I've been playing with isControl, whitespace, etc. Ready to rip my hair out.

October 22, 2022

On Saturday, 22 October 2022 at 21:53:05 UTC, WhatMeWorry wrote:

>

string[] tokens = userSID.output.split!isWhite;
writeln("tokens = ", tokens);

tokens = ["SID", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "S-1-5-21-3823976785-3597194045-4221507747-1779", "", "", "", "", "", "", "", ""]

Is there a clever way that I can discard all the extra null strings in the resultant string array?

I've been playing with isControl, whitespace, etc. Ready to rip my hair out.

Why not strip? Works on ranges:
https://dlang.org/phobos/std_algorithm_mutation.html#.strip

October 22, 2022
On 10/22/22 14:53, WhatMeWorry wrote:
>
>
> string[] tokens = userSID.output.split!isWhite;
> writeln("tokens = ", tokens);

Could you please show minimal compilable code that demonstrates the issue. I spent some time with some guesses but failed (to get my code to compile with std.array.split).

Ali

P.S. Sorry for also sending email.
October 22, 2022

MWE Code:

module DlangForumsMWE;

import std.stdio;
import std.algorithm.mutation;

int main()
{
   //string[] tokens = userSID.output.split!isWhite;
   //writeln("tokens = ", tokens);

   auto tokens = ["SID", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
                  "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
                  "", "", "", "S-1-5-21-3823976785-3597194045-4221507747-1779", "", "", "", "", "", "", "", ""];

   writeln("Before:\n", tokens);

   writeln();
   tokens = tokens.remove!(x => x == "");
   writeln("After:\n", tokens);

   readln();
   return 0;
}

Outputs:

Before:
["SID", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "S-1-5-21-3823976785-3597194045-4221507747-1779", "", "", "", "", "", "", "", ""]

After:
["SID", "S-1-5-21-3823976785-3597194045-4221507747-1779"]
October 22, 2022

On Saturday, 22 October 2022 at 22:01:09 UTC, Enjoys Math wrote:

>

On Saturday, 22 October 2022 at 21:53:05 UTC, WhatMeWorry wrote:

>

string[] tokens = userSID.output.split!isWhite;
writeln("tokens = ", tokens);

tokens = ["SID", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "S-1-5-21-3823976785-3597194045-4221507747-1779", "", "", "", "", "", "", "", ""]

Is there a clever way that I can discard all the extra null strings in the resultant string array?

I've been playing with isControl, whitespace, etc. Ready to rip my hair out.

Why not strip? Works on ranges:
https://dlang.org/phobos/std_algorithm_mutation.html#.strip

Strip won't work because it only works on the beginning and ends of the range. What you want is remove. See my other MWE post.

October 23, 2022

On Saturday, 22 October 2022 at 21:53:05 UTC, WhatMeWorry wrote:

>

string[] tokens = userSID.output.split!isWhite;
writeln("tokens = ", tokens);
[...]
Is there a clever way that I can discard all the extra null strings in the resultant string array?

Easiest way is to use filter. Here's an example:

import std.algorithm: splitter, filter;
import std.uni: isWhite; // or use std.ascii for non-unicode input
import std.array: array;
import std.stdio: writeln;

string exampleText =
    "Hello           123-456-ABC    x\ny\tz\r\nwvu   goodbye";

void main()
{
	string[] tokens = exampleText
        .splitter!isWhite
        .filter!(t => t.length > 0)
        .array;
	writeln("tokens = ", tokens);
}

I've also used the lazily-evaluated splitter instead of the eagerly-evaluated split, to avoid allocating a temporary array unnecessarily.

October 22, 2022

On 10/22/22 5:53 PM, WhatMeWorry wrote:

>

string[] tokens = userSID.output.split!isWhite;
writeln("tokens = ", tokens);

tokens = ["SID", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "S-1-5-21-3823976785-3597194045-4221507747-1779", "", "", "", "", "", "", "", ""]

Is there a clever way that I can discard all the extra null strings in the resultant string array?

I've been playing with isControl, whitespace, etc. Ready to rip my hair out.

Try just split without the isWhite. If you look at the docs, you will see:

"When no delimiter is provided, strings are split into an array of words, using whitespace as delimiter. Runs of whitespace are merged together (no empty words are produced)."

-Steve