首页 > 解决方案 > Javascript:将长 CSV 字符串拆分为字符串数组而不会丢失值

问题描述

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

118.0000000000,102.6666666666 
110.6666666666,97.5000000000
82.5000000000,86.6666666666

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

标签: javascriptarraysnvarchar

解决方案


如果您的字符串真的很长,那么手动使用索引可能会更快,而不是将所有内容分解为数组 - 它的可读性并没有降低很多。为此,您只需在每个循环中查看超过 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) )


推荐阅读