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) )
我正在尝试为我认为可以通过 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) )