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