我基于先前的问题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.parsers.splitLines
解析csv,但是这次我想逐行检查在第三个逗号,
之后,我将获得所有剩余的字符串,并将逗号替换为其他逗号像冒号:
这样的分隔符。
例如:
value1, value2, value3, value4.1,value4.2,value4.3 --> value1, value2, value3, value4.1-value4.2-value4.3
此刻,我仍然不知道从哪里开始。 欢呼!!
JSFiddle提供理想的输出:
答案 0 :(得分:1)
好,我们开始:
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
更改了代码。
同样,如果您知道我的意思,那么该溢出解决方案只会将“丢失的情况”包装到最后一个标头中。
当您得到last answer时,我将只讨论更改。
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>
。