On 10/04/2017 02:04 AM, Biotronic wrote:

> I opted for writing to stdout instead, because 1) it's easier, x) it's
> less code, and b) it's more flexible.

Exactly! :)

> a simple replacement of readText with an mmapped equivalent should
> enable humongous file support with no other code change required.

Here is one from me:

import std.stdio;
import std.algorithm;
import std.string;
import std.range;

const delim = ",";

auto byColumn(R)(R range) {
    return range
           .splitter(delim)
           .map!strip;
}

int main(string[] args) {
    if (args.length != 3) {
        stderr.writefln("USAGE: %s <column-name> <replacement>", args[0]);
        return 1;
    }

    const columnName = args[1];
    auto lines = stdin.byLine;

    const columnNumber = lines
                         .front
                         .byColumn
                         .countUntil(columnName);
    if (columnNumber == -1) {
        stderr.writefln(`ERROR: Failed to find "%s".`, columnName);
        return 1;
    }

    writeln(lines.front);
    lines.popFront();

    const replacement = args[2];
    auto replaced = lines
                    .map!(line => line
                                  .byColumn
                                  .enumerate
.map!(t => (t[0] == columnNumber) ? replacement : t[1])
                                  .joiner(delim));

    writefln("%(%s\n%)", replaced);

    return 0;
}

Ali

Reply via email to