Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
File 如何在D中计算行数并以功能方式执行操作?_File_Functional Programming_D - Fatal编程技术网

File 如何在D中计算行数并以功能方式执行操作?

File 如何在D中计算行数并以功能方式执行操作?,file,functional-programming,d,File,Functional Programming,D,我有以下代码: import std.algorithm; import std.array; import std.csv; import std.stdio; import std.typecons; import std.getopt; import std.file; import std.conv; struct DataPoint{ double x,y,z; this(double _x, double _y, double _z){ x = _

我有以下代码:

import std.algorithm;
import std.array;
import std.csv;
import std.stdio;
import std.typecons;
import std.getopt;
import std.file;
import std.conv;

struct DataPoint{
    double x,y,z;

    this(double _x, double _y, double _z){
        x = _x;
        y = _y;
        z = _z;
    }

    this(char[][] a){
        x = to!double(a[0]);
        y = to!double(a[1]);
        z = to!double(a[2]);
    }

    DataPoint opBinary(string s)(DataPoint d) if (s == "+"){
        auto ret = DataPoint(x + d.x, y + d.y, z + d.z);
        return ret;
    }
}

void main(string[] args)
{
    string csvFile;
    try{
        getopt(args, std.getopt.config.required, "input|i", &csvFile);
        assert(csvFile.isFile);
    }
    catch(Exception e){
        writeln(e.msg);
        return;
    }

    auto file = File(csvFile, "r");
    int lineCount = 0;
    foreach (string line; lines(file)){
        ++lineCount;
    }
    file.close();

    file = File(csvFile, "r");
    auto aa = file.byLine()                      // Read lines
                       .map!split                // Split into words
                       .map!(a => DataPoint(a))
                       .reduce!((a,b) => a + b);
    auto average = DataPoint(aa.x/lineCount, aa.y/lineCount, aa.z/lineCount);

    std.stdio.writefln("After reading %d records, "
                      ~"the average is [%.2f, %.2f, %.2f]", lineCount, average.x, average.y, average.z);
}

在迭代文件内容的同时,如何计算文件中的行数?(一次性)

您可以在拆分为单词之前映射标识增量函数,如下所示:

file.byLine()
    .map!((a){ lineCount++; return a; })
    ...

此外,您应该考虑使用
折叠
而不是
减少
,因为在使用起始值时后者的参数顺序很奇怪。

您可以在拆分为单词之前映射标识增量函数,如下所示:

file.byLine()
    .map!((a){ lineCount++; return a; })
    ...

此外,由于使用起始值时后者的参数顺序怪异,您应该考虑使用
fold
而不是
reduce

这不是很实用,但您可以使用
tee
进行内联处理:

int count = 0;
auto x = stdin.byLine.tee!(_ => ++count).map!(/+ ... whatever ... +/);

它不是很实用,但您可以使用
tee
进行内联处理:

int count = 0;
auto x = stdin.byLine.tee!(_ => ++count).map!(/+ ... whatever ... +/);

在每行上添加一个简单的foreach,同时增加一个变量,这可能是最简单的方法。看看你的代码,你几乎有。在foreach循环中使用您的算法函数,您应该能够在每一行上使用简单的foreach,而递增变量可能是最简单的方法。看看你的代码,你几乎有。在foreach循环中使用您的算法函数,您应该可以很好地使用它