【问题标题】:can String.prototype.split() differentiate between two instances of a characterString.prototype.split() 可以区分一个字符的两个实例
【发布时间】:2021-07-13 05:32:42
【问题描述】:

我正在处理相当大的 csv 文件(不是我的,我无法更改文件的格式)。 我的脚本将文件读入字符串,然后首先使用 .split() 方法将其转换为数组,然后使用“\n”拆分行。 行的分隔符是逗号 (",")。 问题是 csv 文件被写入在一些值中包含逗号,如下所示:

Type,Class,Result\n
AA,SG26,27%\n
AC,DC747,17%\n
"FF,RF",R$%,89%\n
HE,RT,56%\n

我的函数将它们视为单独的值,因为它依赖于分隔符为“,”的 split(),因此它将本示例中的所有值(如 csv[2][Type])一分为二。

我在拆分字符串之前尝试过使用替换功能:

String.prototype.processCSV = function(delimiter = ","){
  var str;
  if(this.includes('"'){
    str = this.replace(/"\s,\s"/g, "");
  }
//rest of the function
}

但我没有看到这样做的任何结果。

有什么方法可以区分值中的逗号和分隔逗号,或者有什么更好的方法将 csv 读入数组(请注意,数组随后会被映射,以便我可以通过键访问值)?

提前谢谢你。

编辑:我应该补充一点,该项目位于一个静态页面上,该页面首先使用 ajax xmlhttpresponse 将 csv 文件加载到字符串中,而不是在节点中,由于项目要求我无法建立节点后端。

【问题讨论】:

  • 使用 csv 解析器。您的输入 csv 文件似乎是正确的 csv 文件,因此真正的 csv 解析器应该可以工作。正如您所发现的,csv 不仅仅是简单地以逗号分隔 - 它是一种正确的文件格式,如 XML 或 JSON。 npm 上有很多 csv 解析器:npmjs.com/search?q=csv
  • 非常感谢您的帮助。我假设它们也适用于脚本(这个项目没有真正的后端,页面是静态的,它只是根据从服务器获取的几个 csv 文件处理数据),所以我不需要在模块中导入将脚本与 src 一起使用。
  • 看看下面我的回答。我演示了如何使用基于浏览器的 Papaparse(尽管后来他们添加了对 node.js 的支持)并且功能非常丰富。只需在 <script> 标记中添加一个指向缩小版本的链接即可。

标签: javascript csv split


【解决方案1】:

不要只在, 上分裂。这不是处理 CSV 文件的正确方法。使用真正的 CSV 解析器。

npm 上有很多 CSV 解析器。这是一个使用 Papaparse 的示例(npmofficial home page):

var results = Papa.parse(csv, {
    header: true
});

console.log(results[0].Type);    // prints AA
console.log(results[0].Class);   // prints SG26
console.log(results[0].Result);  // prints 27%

【讨论】:

  • 非常感谢您的帮助。我假设它们也适用于脚本(这个项目没有真正的后端,页面是静态的,它只是根据从服务器获取的几个 csv 文件处理数据),所以我不需要在模块中导入将脚本与 src 一起使用。
【解决方案2】:

“区分不同位置的逗号”唯一真正的方法是解析字符串,并以不同的方式处理“之间的字符。

  const input = `"1,1","2,2"`;
  
  let pos = 0;
  while (pos < input.length) {
     switch (input[pos]) {
        case `,`:
          // handle comma
          break;
        case `\n`:
          // handle newline
          break;
        case `"`:
          const end = input.indexOf(`"`, pos + 1);
          // handle string
          // skip processing the string
          pos = end;
          break;
     }
     pos += 1;
 }

但是,与其编写自己的解析器(虽然这是一个有趣的练习),不如使用现有的实现来代替。

【讨论】:

  • 非常感谢您的帮助,是的,我可能需要。但我会在以后的实验中使用你的想法作为参考。
  • 你毕竟是对的,因为我正在处理一个特定的案例,我的基于你的答案的解析器工作得更快,因为它针对我需要的表进行了优化。我最初按照 slebetman 的建议使用 Papa.parse,效果很好,问题在于兼容性,有时它返回错误,我不知道为什么(因为我没有构建它)。感谢 slebetman 和您建议使用解析器,我已经完成了部分任务,但是遇到了问题,所以我刚刚完成了解析器,没有出现意外错误。
  • 我想,如果可以的话,我应该始终从头开始制定解决方案,因为与必须针对一般用途进行优化的现成解决方案相比,它更适合手头的任务。跨度>
  • @aibarmanas 是的,这是您在重用现有代码时通常需要找到的平衡点。听起来您做出了一些合理的选择。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-20
  • 1970-01-01
  • 2018-12-02
  • 2021-08-10
  • 1970-01-01
  • 2012-04-05
  • 1970-01-01
相关资源
最近更新 更多