訂明本例驗收任務
假設結果接收器可用原始資料文字,或恰好一組外層 csv 程式碼框,框前後不能有其他行。開閉框各佔一行;其他框位置屬格式錯誤。沒有框的備註仍是內容,不能靜默刪去。只回內容及行數,不驗 CSV 意思。
- 確認完整外層包裝
- 只去掉容許開閉行
- 資料文字原樣保留
包裝錯誤便暫停,不猜資料起點。
使用已填個案
| 個案 | 已提供輸入 | 預期結構化結果 | 判斷及原因 |
|---|---|---|---|
| 一組完整外框 | {"text":"```csv\na,b\n1,2\n```"} | {"payload":"a,b\n1,2","lines":2} | 只移除已訂外框,兩行資料保留。 |
| 備註沒有外框 | {"text":"Note\na,b\n1,2"} | {"payload":"Note\na,b\n1,2","lines":3} | Note 仍留作輸入,下一步資料核對才判是否可接。 |
| 閉框後多一行 | {"text":"```csv\na,b\n```\nNote"} | {"error":"wrapper"} | 整份輸入不符合只得一組外框的要求。 |
逐步處理 trailing-note 個案,須得到甚麼結果?原因是甚麼?
查看參考答案
{"error":"wrapper"}。整份輸入不符合只得一組外框的要求。
執行完整本機驗算
import assert from 'node:assert/strict';
function evaluate(x){
const fence=String.fromCharCode(96).repeat(3),lines=x.text.split('\n');if(lines[0]===fence+'csv'&&lines.at(-1)===fence&&lines.slice(1,-1).every(l=>!l.includes(fence))){const payload=lines.slice(1,-1).join('\n');return {payload,lines:payload?lines.length-2:0};}
if(x.text.includes(fence))return {error:'wrapper'};return {payload:x.text,lines:x.text?lines.length:0};
}
const cases = [
{
"id": "one-outer-fence",
"input": {
"text": "```csv\na,b\n1,2\n```"
},
"expected": {
"payload": "a,b\n1,2",
"lines": 2
}
},
{
"id": "unfenced-note",
"input": {
"text": "Note\na,b\n1,2"
},
"expected": {
"payload": "Note\na,b\n1,2",
"lines": 3
}
},
{
"id": "trailing-note",
"input": {
"text": "```csv\na,b\n```\nNote"
},
"expected": {
"error": "wrapper"
}
}
];
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)}));
排查匯入接收器時原始與移框後文字一起保存。csv 框名是本例字面格式;程式沒有解析或認證 CSV 內容。