跳至內容
Astera Technology

拆搬移腳本為何弄壞含分號的備註?

完整語句交 SQL 引擎讀,不在引號內資料拆句。

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

先核來源與已訂規則

本例本地腳本建備註表,再插 a;b 及 c。引號內分號是資料,不是語句界。更正整份生成腳本交 SQLite;資料單引號加倍,只生成此固定本地建表及插入形狀。

已填假設輸入
紀錄輸入 JSON
原例輸入{"memos":["a;b","c"]}
下載可編輯 CSV ↓

比較兩條實際路徑

隨便按分號拆,首值引號未完便失敗,沒有資料行。更正目標照次序有兩個原備註。

錯誤與更正路徑的輸出
路徑輸出 JSON
錯誤路徑{"error":{"code":1},"records":[]}
更正路徑{"error":null,"records":[{"memo":"a;b"},{"memo":"c"}]}
下載可編輯 CSV ↓
本地 Node.js 程序:22.23.3 或 24.14.1
import {DatabaseSync} from 'node:sqlite';
import {TextDecoder} from 'node:util';
import {inflateSync} from 'node:zlib';
import {posix} from 'node:path';
import {createHash} from 'node:crypto';
const rows=(db,sql)=>db.prepare(sql).all().map(r=>({...r}));
const failed=(action)=>{try{action();return null;}catch(e){return {code:e.errcode??e.code??e.name};}};

import assert from 'node:assert/strict';
const run=function run(i,corrected=true){
    const db=new DatabaseSync(':memory:');try{const quoted=s=>"'"+s.replace(/'/g,"''")+"'";const script='CREATE TABLE target(memo TEXT);'+i.memos.map(m=>'INSERT INTO target VALUES('+quoted(m)+');').join('');
      const error=failed(()=>{if(corrected)db.exec(script);else for(const fragment of script.split(';'))if(fragment.trim())db.exec(fragment);});
      return {error,records:rows(db,'SELECT * FROM target ORDER BY rowid')};
    }finally{db.close();}
  };
const cases=[{"label":"misleading base","input":{"memos":["a;b","c"]},"expected":{"error":{"code":1},"records":[]},"corrected":false},{"label":"corrected base","input":{"memos":["a;b","c"]},"expected":{"error":null,"records":[{"memo":"a;b"},{"memo":"c"}]},"corrected":true},{"label":"escaped quote and semicolon","input":{"memos":["O'Neil;next"]},"expected":{"error":null,"records":[{"memo":"O'Neil;next"}]},"corrected":true},{"label":"no data statements","input":{"memos":[]},"expected":{"error":null,"records":[]},"corrected":true}];
for(const test of cases){
  const actual=run(test.input,test.corrected);
  assert.deepEqual(actual,test.expected,test.label);
  console.log(test.label,actual);
}
下載可執行例子 ↓

下次載入前核邊界

O'Neil;next 的單引號及分號都保;沒有備註輸入,則建空目標,不發插入句。

可編輯邊界紀錄及預期輸出
情況輸入 JSON預期輸出 JSON
資料含單引號及分號{"memos":["O'Neil;next"]}{"error":null,"records":[{"memo":"O'Neil;next"}]}
沒有備註插入紀錄{"memos":[]}{"error":null,"records":[]}
下載可編輯 CSV ↓

a;b 應拆兩句,還是存一個備註?

查看參考答案

一個備註,分號在引號內,引擎會保 a;b,不把它當句界。

相關資源