39 lines
1.3 KiB
D
39 lines
1.3 KiB
D
import std.stdio, std.array, std.string, std.regex, std.conv,
|
|
std.algorithm;
|
|
|
|
void main() {
|
|
// works but eats lot of RAM in DMD 2.059
|
|
//const rxDate = ctRegex!(`^\d\d\d\d-\d\d-\d\d$`);
|
|
auto rxDate = regex(`^\d\d\d\d-\d\d-\d\d$`);
|
|
|
|
int[string] repeatedDates;
|
|
int goodReadings;
|
|
foreach (string line; lines(File("readings.txt"))) {
|
|
try {
|
|
auto parts = line.split();
|
|
if (parts.length != 49)
|
|
throw new Exception("Wrong column count");
|
|
if (match(parts[0], rxDate).empty)
|
|
throw new Exception("Date is wrong");
|
|
repeatedDates[parts[0]]++;
|
|
bool noProblem = true;
|
|
for (int i = 1; i < 48; i += 2) {
|
|
if (to!int(parts[i + 1]) < 1)
|
|
// don't break loop because it's validation too.
|
|
noProblem = false;
|
|
if (!isNumeric(parts[i]))
|
|
throw new Exception("Reading is wrong: "~parts[i]);
|
|
}
|
|
if (noProblem)
|
|
goodReadings++;
|
|
} catch(Exception ex) {
|
|
writefln(`Problem in line "%s": %s`, line, ex);
|
|
}
|
|
}
|
|
|
|
writeln("Duplicated timestamps: ",
|
|
repeatedDates.keys.filter!(k => repeatedDates[k] > 1)().
|
|
join(", "));
|
|
writeln("Good reading records: ", goodReadings);
|
|
}
|