chaining splitters
dnoob via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Thu Mar 12 20:37:54 PDT 2015
Yes. That's it! Thanks a lot.
On Wednesday, 11 March 2015 at 09:29:12 UTC, Dave S wrote:
> On Wednesday, 11 March 2015 at 00:00:39 UTC, dnoob wrote:
>> Hello,
>>
>> I am parsing some text and I have the following;
>>
>> string text = "some very long text";
>>
>> foreach(line; splitter(text, [13, 10]))
>> {
>> foreach(record; splitter(line, '*'))
>> {
>> foreach(field; splitter(record, '='))
>> {
>> foreach(value; splitter(field, ','))
>> {
>> // do something...
>> }
>> }
>> }
>> }
>>
>> I know there is a better way to do that but I'm a total D noob.
>>
>> Thanks!
>
> You can use std.algorithm's map to apply some function to all
> the
> items in a range:
> ---
>
> import std.stdio, std.algorithm;
>
> void main()
> {
> string text = "foo*bar=qux\r\nHello*world!\r\nApril,May,June";
>
> auto lines = splitter(text, "\r\n");
> auto records = map!(a => splitter(a, '*'))(lines).joiner();
> auto fields = map!(a => splitter(a, '='))(records).joiner();
> auto values = map!(a => splitter(a, ','))(fields).joiner();
>
> foreach (value; values)
> {
> writeln(value);
> }
> }
>
> ---
> This produces the output:
>
> foo
> bar
> qux
> Hello
> world!
> April
> May
> June
>
> The joiner() is necessary because when you pass a range of
> strings to splitter using map the result is a range of ranges of
> strings. joiner() joins these together into one range of
> strings.
> Consider this code, for example:
> ---
>
> string str = "foo*bar=qux\r\nHello*world!\r\nApril,May,June";
>
> auto lines = splitter(str, [13, 10]);
> auto result = map!(a => splitter(a, '*'))(lines);
> auto tokens = result.joiner();
>
> ---
> The contents of result are:
>
> ["foo", "bar=qux"]
> ["Hello", "world!"]
> ["April,May,June"]
>
> The contents of tokens are:
>
> ["foo", "bar=qux", "Hello", "world!", "April,May,June"]
>
> I am not a D expert by any means so there it's possible there is
> another way that I am not aware of.
More information about the Digitalmars-d-learn
mailing list