Reading a file of words line by line

mipri mipri at minimaltype.com
Tue Jan 14 17:13:07 UTC 2020


On Tuesday, 14 January 2020 at 16:39:16 UTC, mark wrote:
> I can't help feeling that the foreach loop's block is rather 
> more verbose than it could be?
>

>     WordSet words;
>     auto rx = ctRegex!(r"^[a-z]+", "i");
>     auto file = File(filename);
>     foreach (line; file.byLine) {
> 	auto match = matchFirst(line, rx);
> 	if (!match.empty()) {
> 	    auto word = match.hit().to!string; // I hope this assumes 
> UTF-8?
> 	    if (word.length == wordsize) {
> 		words[word.toUpper] = 0;
> 	    }
> 	}
>     }
>     return words;
> }
> ----

One thing I picked up during Advent of Code last year was
std.file.slurp, which was great for reading 90% of the input
files from that contest. With that, I'd do this more like

   int[string] words;
   slurp!string("input.txt", "%s").each!(w => words[w] = 0);

Where "%s" is what slurp() expects to find on each line, and
'string' is the type it returns from that. With just a list of
words this isn't very interesting. Some of my uses from the
contest are:

   auto input = slurp!(int, int, int)(args[1], "<x=%d, y=%d, 
z=%d>")
       .map!(p => Moon([p[0], p[1], p[2]])).array;

   Tuple!(string, string)[] input =
       slurp!(string, string)("input.txt", "%s)%s");

Of course if you want to validate the input as you're reading
it, you still have to do extra work, but it could be in a
.filter!



More information about the Digitalmars-d-learn mailing list