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循环中使用您的算法函数,您应该可以很好地使用它