2026年4月18日 星期六

Google Apps Script 使用 Utilities.parseCsv 發生 Could not parse text,找出問題資料除錯

使用 Google Apps Script 到公開資訊觀測站抓取股利分派情形(https://mops.twse.com.tw/mops/#/web/t05st09_new),
原本排程正常執行,但今天發現上市資料解析 CSV 檔失敗,出現 Could not parse text 錯誤訊息,
但上櫃資料仍可正常解析。


判斷可能是 CSV 檔,出現奇怪格式資料,導致 Utilities.parseCsv 解析失敗。
將 CSV 檔下載下來,用能看見換行符號的文字編輯器打開,觀察是用什麼區別資料列(row)。
如下圖,可看出是 CRLF,即 \r\n



在原程式 Utilities.parseCsv 前,加入以下程式碼,進行逐筆資料解析,找出是哪一筆資料解析錯誤
var lines = csvText.split('\r\n');
for (var i = 0; i < lines.length; i++) {
  try {
    Utilities.parseCsv(lines[i]);
  } catch (e) {
    Logger.log("解析失敗發生在第 " + (i + 1) + " 筆資料: " + lines[i]);
  }
}
throw new Error("debug....");




執行結果,如下圖,發現是第553筆資料解析出錯,
觀察該筆資料,在資料欄裡出現重複雙引號「""」,
猜測是輸入資料的人員,也在該欄資料前後加上雙引號「"」,但 CSV輸出時沒正確處理導致。


我決定用  replace 將該欄資料,輸入的雙引號去除,
在該檔案和可正常解析的上櫃CSV檔尋找後,確定只有該處有雙引號重複情形,
原本只需 replace('""', '"'),但保險點,我選擇多加些前後額外文字比對,最終加入以下程式碼
//特例處理
csvText = csvText.replace('",""本公司章程規定年度決算如有盈餘', '","本公司章程規定年度決算如有盈餘');
csvText = csvText.replace('由董事會擬具議案並提請股東會決議。"","', '由董事會擬具議案並提請股東會決議。","');


修改後,即可正常解析











沒有留言:

張貼留言