Text processing/1: Difference between revisions
Content added Content deleted
(Add Swift) |
|||
Line 3,727: | Line 3,727: | ||
</pre> |
</pre> |
||
''Output is from the sample of the task.'' |
''Output is from the sample of the task.'' |
||
=={{header|Swift}}== |
|||
{{trans|Rust}} |
|||
<lang swift>import Foundation |
|||
let fmtDbl = { String(format: "%10.3f", $0) } |
|||
Task.detached { |
|||
let formatter = DateFormatter() |
|||
formatter.dateFormat = "yyyy-MM-dd" |
|||
let (data, _) = try await URLSession.shared.bytes(from: URL(fileURLWithPath: CommandLine.arguments[1])) |
|||
var rowStats = [(Date, Double, Int)]() |
|||
var invalidPeriods = 0 |
|||
var invalidStart: Date? |
|||
var sumFile = 0.0 |
|||
var readings = 0 |
|||
var longestInvalid = 0 |
|||
var longestInvalidStart: Date? |
|||
var longestInvalidEnd: Date? |
|||
for try await line in data.lines { |
|||
let lineSplit = line.components(separatedBy: "\t") |
|||
guard !lineSplit.isEmpty, let date = formatter.date(from: lineSplit[0]) else { |
|||
fatalError("Invalid date \(lineSplit[0])") |
|||
} |
|||
let data = Array(lineSplit.dropFirst()) |
|||
let parsed = stride(from: 0, to: data.endIndex, by: 2).map({idx -> (Double, Int) in |
|||
let slice = data[idx..<idx+2] |
|||
return (Double(slice[idx]) ?? 0, Int(slice[idx+1]) ?? 0) |
|||
}) |
|||
var sum = 0.0 |
|||
var numValid = 0 |
|||
for (val, flag) in parsed { |
|||
if flag <= 0 { |
|||
if invalidStart == nil { |
|||
invalidStart = date |
|||
} |
|||
invalidPeriods += 1 |
|||
} else { |
|||
if invalidPeriods > longestInvalid { |
|||
longestInvalid = invalidPeriods |
|||
longestInvalidStart = invalidStart |
|||
longestInvalidEnd = date |
|||
} |
|||
sumFile += val |
|||
sum += val |
|||
numValid += 1 |
|||
readings += 1 |
|||
invalidPeriods = 0 |
|||
invalidStart = nil |
|||
} |
|||
} |
|||
if numValid != 0 { |
|||
rowStats.append((date, sum / Double(numValid), parsed.count - numValid)) |
|||
} |
|||
} |
|||
for stat in rowStats.lazy.reversed().prefix(5) { |
|||
print("\(stat.0): Average: \(fmtDbl(stat.1)); Valid Readings: \(24 - stat.2); Invalid Readings: \(stat.2)") |
|||
} |
|||
print(""" |
|||
Sum File: \(fmtDbl(sumFile)) |
|||
Average: \(fmtDbl(sumFile / Double(readings))) |
|||
Readings: \(readings) |
|||
Longest Invalid: \(longestInvalid) (\(longestInvalidStart!) - \(longestInvalidEnd!)) |
|||
""") |
|||
exit(0) |
|||
} |
|||
dispatchMain() |
|||
</lang> |
|||
{{out}} |
|||
<pre>2004-12-31 05:00:00 +0000: Average: 2.057; Valid Readings: 23; Invalid Readings: 1 |
|||
2004-12-30 05:00:00 +0000: Average: 2.839; Valid Readings: 23; Invalid Readings: 1 |
|||
2004-12-29 05:00:00 +0000: Average: 2.448; Valid Readings: 23; Invalid Readings: 1 |
|||
2004-12-28 05:00:00 +0000: Average: 3.383; Valid Readings: 23; Invalid Readings: 1 |
|||
2004-12-27 05:00:00 +0000: Average: 2.483; Valid Readings: 23; Invalid Readings: 1 |
|||
Sum File: 1358393.400 |
|||
Average: 10.497 |
|||
Readings: 129403 |
|||
Longest Invalid: 589 (1993-02-09 05:00:00 +0000 - 1993-03-05 05:00:00 +0000)</pre> |
|||
=={{header|Tcl}}== |
=={{header|Tcl}}== |