jquery - 在连续第三个逗号后将逗号更改为冒号
问题描述
我根据我之前的问题JQuery-csv not parsing all values提出了一个问题,这个问题将是解决我的问题的解决方法,但仍然需要稍微调整溢出的单元格不会出现的地方,但我可以不知道从哪里或如何开始。
我的 csv 文件如下所示:test.csv
header1, header2, header3, header4
value1, value2, value3, value4
value1, value2, value3, value4.1,value4.2,value4.3
value1, value2, value3, value4
我使用 解析 csv csv.parsers.splitLines
,但这次我想逐行检查在第三个逗号之后,
我将获取所有剩余的字符串并用其他分隔符(如冒号)替换逗号:
。前任:
value1, value2, value3, value4.1,value4.2,value4.3 --> value1, value2, value3, value4.1-value4.2-value4.3
目前我仍然不知道在这个问题上从哪里开始,在这个问题上一个很好的推动会很棒。干杯!!
JSFiddle 用于我的理想输出:
解决方案
好的,我们开始:
var separator = ",",
agregator = "-";
function generateTable(lines) {
if (typeof(lines) === 'undefined' || lines.length == 0) {
return '';
}
var header = lines[0].split(separator);
var html = '';
var rows = [];
// mapping
for (var row in lines) {
if(row == 0) {
continue;
}
var cols = lines[row].split(separator),
values = {};
for (var col in cols) {
var item = header[col] ? header[col] : header[header.length-1];
if(values[item]) {
values[item].push(cols[col]);
} else {
values[item] = [cols[col]];
}
}
rows.push(values);
}
// printing
for(var row in rows) {
html += '<tr>\r\n';
for(var item in rows[row]) {
html += '<td>' + item + ':' + rows[row][item].join(agregator) + '</td>\r\n';
}
html += '</tr>\r\n';
}
return html;
}
$.ajax({
type: "GET",
url: "test.csv",
dataType: "text",
success: function(response) {
$('#result').html(generateTable($.csv.parsers.splitLines(response)));
}
});
正如我在上一个问题上所说,要实现您想要的,您必须首先映射这些值,然后打印这些信息。请注意,我用新变量更改了一点我们的代码,separator
只是agregator
为了方便更改。如果您知道我的意思,那么溢出解决方案只是将“丢失的案例”包装到最后一个标题。当你得到最后一个答案时,我将只谈谈这些变化。
映射
for (var row in lines) {
if(row == 0) {
continue;
}
var cols = lines[row].split(separator),
values = {};
for (var col in cols) {
var item = header[col] ? header[col] : header[header.length-1];
if(values[item]) {
values[item].push(cols[col]);
} else {
values[item] = [cols[col]];
}
}
rows.push(values);
}
rows
在这里我将填充简单的对象,而不是填充 html 变量。我决定使用一个简单的语法:{headerName: [headerValues]}
. 因此,每个具有相同名称的标头都将位于同一个数组中。容易,对吧?一个循环到行,一个循环到列,我们就完成了。
印刷
for(var row in rows) {
html += '<tr>\r\n';
for(var item in rows[row]) {
html += '<td>' + item + ':' + rows[row][item].join(agregator) + '</td>\r\n';
}
html += '</tr>\r\n';
}
打印更容易,因为最难的部分已经过去。您只需要再次循环行和列,只需进行语法转换:{headerName:[headerValues]}
到<td>headerName: [headerValues].join(agregator)</td>
.
推荐阅读
- reactjs - React Router v6 不会使用浏览器 URL 渲染/同步特定路由
- google-apps-script - Google Apps 脚本 - 6 分钟时间限制
- reactjs - React Hooks API 调用 - 它必须在 useEffect 中吗?
- python - 带有信息和警告消息的 Python 日志记录模块的意外行为
- python - 将数据框与列值匹配结合起来
- amazon-s3 - 如何使用uproot从s3读取文件?
- spring - 使用 Spring Boot 将数据写入 splunk
- c# - 使用可选参数模拟异步方法会抛出 Expression is not a Property Access
- java - AWS Lamda 为 jdbc 和 org.json JARS 提供类未找到异常
- flutter - Flutter InkWell 小部件未通过容器的渐变和颜色显示