跳至內容
Astera Technology

候選檔案超出指定讀取限制便先隔離

本機接收先核位元組上限及行數,超限保留原文與原因。

下載完整個案資料及參考答案 ↓

訂明本例驗收任務

假設本機驗算接收上限為100個 UTF-8 位元組及三個由 LF 分開的非空行。先核位元組,才核行數;暫停時保留原文。恰好100可在大小界內,空字串是零行。這是本機用量上限,不認證安全或檔案格式。

  1. 按指定編碼數位元組
  2. 大小界內才數 LF 非空行
  3. 超限文字在解析前暫停

暫停仍保留原文及原因,不能靜默截短塞入。

使用已填個案

原創假設輸入及確切答案鍵
個案已提供輸入預期結構化結果判斷及原因
恰好位元組上限{"raw":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}{"status":"ready-to-parse","bytes":100,"rows":1}恰好100個 ASCII 位元組可接,仍未通過內容解析。
超出一個位元組{"raw":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}{"status":"size-hold","bytes":101}大小超限,未進行數或解析判斷就暫停。
四個非空行{"raw":"a\nb\nc\nd"}{"status":"row-hold","bytes":7,"rows":4}七位元組在界內,但四行超出另一上限。
下載可編輯 CSV ↓

逐步處理 four-rows 個案,須得到甚麼結果?原因是甚麼?

查看參考答案

{"status":"row-hold","bytes":7,"rows":4}。七位元組在界內,但四行超出另一上限。

執行完整本機驗算

另存為 .mjs,以 Node.js 執行;只驗提供的個案
import assert from 'node:assert/strict';
import {Buffer} from 'node:buffer';

function evaluate(x){
 const bytes=Buffer.byteLength(x.raw,'utf8');if(bytes>100)return {status:'size-hold',bytes};const rows=x.raw===''?0:x.raw.split('\n').filter(line=>line!=='').length;
 return {status:rows>3?'row-hold':'ready-to-parse',bytes,rows};
}

const cases = [
  {
    "id": "exact-byte-limit",
    "input": {
      "raw": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
    },
    "expected": {
      "status": "ready-to-parse",
      "bytes": 100,
      "rows": 1
    }
  },
  {
    "id": "one-byte-over",
    "input": {
      "raw": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
    },
    "expected": {
      "status": "size-hold",
      "bytes": 101
    }
  },
  {
    "id": "four-rows",
    "input": {
      "raw": "a\nb\nc\nd"
    },
    "expected": {
      "status": "row-hold",
      "bytes": 7,
      "rows": 4
    }
  }
];
for (const c of cases) assert.deepEqual(evaluate(c.input), c.expected, c.id);
console.log(JSON.stringify({checked:cases.length,caseIds:cases.map(c=>c.id)}));
下載可執行例子 ↓

此上限後另做解析及業務核對。正式使用須另提供上限,本例沒有保證可安全處理任意檔案。

相關資源

系統開發服務 →