Javascript:将长 CSV 字符串拆分为字符串数组而不丢失值

Javascript: Split a long CSV string into array of strings without losing the values

我正在尝试为我认为可以通过 JavaScript 解决的 SQL 问题找到解决方案,但无法概念化解决方案并需要一些帮助。我有一个长字符串 (118.0000000000,102.6666666666,110.6666666666,97.5000000000,82.5000000000,86.6666666666 .... 15000 characters long),我需要将其分成最大字符串长度 4000(SQL NVARCHAR(max) 限制)并将字符串迭代到存储过程以进行进一步处理。可以说使用上面的字符串我想以 35 个字符的长度拆分字符串但不丢失数据并在第 35 个字符之前的最后一个 ',' 处终止新字符串并从该点开始构建下一个字符串,所以基本上字符串看起来像这样:

118.0000000000,102.6666666666 
110.6666666666,97.5000000000
82.5000000000,86.6666666666

我试图浏览所有已经提出的与拆分字符串相关的解决方案,但无法提取可能导致在此处解决我的问题的信息。感谢所有帮助!

使用 substr() 获取前 35 个字符,将其拆分为一个数组,然后删除数组的最后一个元素,因为它可能不是一个完整的数字。

var csv = "118.0000000000,102.6666666666,110.6666666666,97.5000000000,82.5000000000,86.6666666666";
var csv35 = substr(csv, 0, 35);
var nums = csv35.split(",");
nums.length--;

如果我对你的问题的理解正确,你想在分隔符处将字符串拆分为预定最大字符长度的块。这是一种功能性方法,可让您动态指定长度和分隔符:

const chunk = (maxLen, separator) => data => data.split(separator).reduce((chunks, v, i) => {
  const last = chunks.length - 1;

  if (chunks[last].length + separator.length + v.length <= maxLen) {
    chunks[last] += (i ? separator : '') + v;
  } else {
    chunks.push(v);
  }
  
  return chunks;
}, ['']);

let chunkAt35ByComma = chunk(35, ',')
let data = '118.0000000000,102.6666666666,110.6666666666,97.5000000000,82.5000000000,86.6666666666'
let chunks = chunkAt35ByComma(data)

console.log(chunks)

如果你的字符串真的很长,手动使用索引可能会更快,而不是将所有内容分解成数组——它的可读性不会差多少。为此,您只需在每个循环中向前看超过 35 个字符的逗号,将部分取到最后一个逗号并将位置重置为逗号加 1 的位置。如果您没有剩下 35 个字符,只需添加最后一个位并停止。

function splitGroups(str, MAX) {
    let res = []
    let start = 0
    
    while (start < str.length) {
        if (str.length - start <= 35) {
            res.push(str.slice(start))
            break
        }
        let c = str.slice(start, str.indexOf(',', start + MAX + 1))
        let end = c.lastIndexOf(',')
        res.push(c.slice(0, end))
        start += end + 1
    }
    return res    
}

let str = "118.0000000000,102.6666666666,110.6666666666,97.5000000000,82.5000000000,86.6666666666"

let groups  = splitGroups(str, 35)
console.log(groups)
console.log("lengths", groups.map(s => s.length) )