Skip to main content

Indie game storeFree gamesFun gamesHorror games
Game developmentAssetsComics
SalesBundles
Jobs
TagsGame Engines
您好:您csv好像处理crlf(\r和\n,webpack后的line299)有点儿问题导致我但凡在linux上编辑csv(使用\n)就会导致大面积字串undefined。 考虑到反正您也用webpack了,有考虑直接import个现成csv parser库替代手动解析来防止这种问题吗?

另外您打包的时候把mac的__MACOSX文件夹也打包进去了诶...

比如 https://www.npmjs.com/package/csv-parse 之类的

搓完了:

class CsvManager {
    static #parseCsv(text) {
       const rows = []
       let row = []
       let field = ''
       let insideQuotes = false
       let i = 0
       while (i < text.length) {
          const char = text[i]
          const next = text[i + 1]
          if (insideQuotes) {
             if (char === '"') {
                if (next === '"') {
                   field += '"'
                   i++
                } else {
                   insideQuotes = false
                }
             } else {
                field += char
             }
          } else {
             if (char === '"') {
                insideQuotes = true
             } else if (char === ',') {
                row.push(field)
                field = ''
             } else if (char === '\n') {
                row.push(field)
                rows.push(row)
                row = []
                field = ''
             } else if (char === '\r') {
                // skip or normalize \r\n
                if (next === '\n') {
                   i++
                }
                row.push(field)
                rows.push(row)
                row = []
                field = ''
             } else {
                field += char
             }
          }
          i++
       }
       if (field !== '' || insideQuotes || row.length > 0) {
          row.push(field)
          rows.push(row)
       }
       return rows
    }
    static async parseLang(fileName) {
       let translations = {};
       LANG_LIST.forEach((langCode => {translations[`${langCode}`] = {}}));
       let colIndex = {};
       LANG_LIST.forEach(((langCode, idx) => {colIndex[`${langCode}`] = idx + 2}));
       const fs = require("fs");
       const str = await fs.promises.readFile(`./csv/${fileName}.csv`, "utf8");
       const csv = CsvManager.#parseCsv(str)
       for (const line of csv) {
          const id = line[0];
          for (const langCode in colIndex) {
             let cell = line[colIndex[langCode]].replaceAll(/\r\n|\r|\n/g, "\n");
             translations[langCode][id] = cell
          }
       }
       return translations
    }
};