Files
lingniu-vehicle-ingest/tmp/g7-mileage-eval-20260724/inspect_sample.mjs
T

116 lines
3.2 KiB
JavaScript

import { FileBlob, SpreadsheetFile } from "@oai/artifact-tool";
const inputPath =
"/Users/lingniu/Downloads/智能管车_车辆里程日报-105652096.xlsx";
const input = await FileBlob.load(inputPath);
const workbook = await SpreadsheetFile.importXlsx(input);
const summary = await workbook.inspect({
kind: "workbook,sheet,table",
maxChars: 12000,
tableMaxRows: 8,
tableMaxCols: 40,
tableMaxCellChars: 120,
});
const sheet = workbook.worksheets.getItemAt(0);
const usedRange = sheet.getUsedRange(true);
const rowCount = usedRange?.rowCount ?? 0;
const columnCount = usedRange?.columnCount ?? 0;
const values = usedRange?.values ?? [];
const headers = values[0] ?? [];
const dateStartIndex = 3;
const dateEndIndex = Math.max(dateStartIndex, headers.indexOf("运行时长"));
let positiveDailyCellCount = 0;
let nonZeroVehicleCount = 0;
let noteVehicleCount = 0;
let mismatchVehicleCount = 0;
let totalDailyKm = 0;
let totalColumnKm = 0;
const nonZeroSamples = [];
const noteSamples = [];
for (const row of values.slice(1)) {
const dailyValues = row
.slice(dateStartIndex, dateEndIndex)
.map(numberValue);
const positiveValues = dailyValues.filter((value) => value > 0);
const rowDailyKm = dailyValues.reduce((sum, value) => sum + value, 0);
const rowTotalKm = numberValue(row[2]);
const note = row[dateEndIndex + 1];
positiveDailyCellCount += positiveValues.length;
totalDailyKm += rowDailyKm;
totalColumnKm += rowTotalKm;
if (positiveValues.length > 0) {
nonZeroVehicleCount += 1;
if (nonZeroSamples.length < 20) {
nonZeroSamples.push({
plate: row[0],
organization: row[1],
totalKm: rowTotalKm,
dailyKm: rowDailyKm,
positiveDayCount: positiveValues.length,
});
}
}
if (note !== null && note !== undefined && String(note).trim() !== "") {
noteVehicleCount += 1;
if (noteSamples.length < 20) {
noteSamples.push({ plate: row[0], note });
}
}
if (Math.abs(rowTotalKm - rowDailyKm) > 0.011) {
mismatchVehicleCount += 1;
}
}
const inspectRange = rowCount > 0 && columnCount > 0
? `A1:${columnName(Math.min(columnCount, 40))}${Math.min(rowCount, 15)}`
: "A1:A1";
const preview = await workbook.inspect({
kind: "table",
sheetId: sheet.name,
range: inspectRange,
include: "values,formulas",
maxChars: 25000,
tableMaxRows: 15,
tableMaxCols: 40,
tableMaxCellChars: 120,
});
console.log(JSON.stringify({
inputPath,
sheetName: sheet.name,
rowCount,
columnCount,
dateColumnCount: Math.max(0, dateEndIndex - dateStartIndex),
positiveDailyCellCount,
nonZeroVehicleCount,
noteVehicleCount,
mismatchVehicleCount,
totalDailyKm: round(totalDailyKm),
totalColumnKm: round(totalColumnKm),
nonZeroSamples,
noteSamples,
summary: summary.ndjson,
preview: preview.ndjson,
}, null, 2));
function columnName(columnCount) {
let value = columnCount;
let name = "";
while (value > 0) {
value -= 1;
name = String.fromCharCode(65 + (value % 26)) + name;
value = Math.floor(value / 26);
}
return name;
}
function numberValue(value) {
const parsed = Number(value);
return Number.isFinite(parsed) ? parsed : 0;
}
function round(value) {
return Math.round(value * 1000) / 1000;
}