将 csv 转换为 json 会添加 '\r' 字符

问题描述

我有一个将 csv 转换为 json 数据的方法

代码如下:

    CSV2JSON(): void {
      const lines = this.csvData.split('\n');
      const result = [];
      const headers = lines[0].split(',');
      console.log(headers);
      for (let i = 1; i < lines.length - 1; i++ ) {
       const obj = {};
       const currentline = lines[i].split(',');

       for (let j = 0; j < headers.length; j++) {
        obj[headers[j]] = currentline[j];
       }

      result.push(obj);

   }

    console.log(JSON.stringify(result)); // JSON
}

这给了我:

[{"name":"test1","code z\r":"0.030\r"}] 

如您所见,'\r' 不应该存在。

如何去除那些 \r 或阻止它们出现在 json 数据中?

解决方法

您的问题在于行尾,而不是 Angular。不同的操作系统对如何编码“换行”字符有不同的标准;在解析人类可读的字符串(例如 CSV 格式)时,这是一个常见的烦人问题。例如,您详细阅读了on Wikipedia

您得到的 \r 可能意味着原始文件有 \n\r 作为行结尾。当您在 \n 处进行拆分时,右侧部分将保留前导 \r。要同时删除 \r,您必须改为按 \n\r 拆分,将整个组视为一个新行。

const s = `foo\n\rbar`
console.log(s.split('\n'))    // bad
console.log(s.split('\n\r'))  // good

但是如果你盲目地这样做,你会错过新行只是\n的情况。

const s = `foo\nbar`
console.log(s.split('\n'))    // good
console.log(s.split('\n\r'))  // bad

要同时处理这两种情况,您可以先用 \n\r 替换所有 \n 实例,然后拆分。

const s = `foo\n\rbar\nbaz`
console.log(s.replace(/\n\r/g,'\n').split('\n'))

但是,使用此代码,您将错过其他仅使用 \r 作为新行的操作系统。您也可以处理这种情况,或者使用现有的库来解析 CSV。 NPM 存储库中可能有一些可供选择。