第三个连续逗号后将逗号更改为冒号

时间:2018-08-27 18:47:14

标签: 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.parsers.splitLines解析csv,但是这次我想逐行检查在第三个逗号,之后,我将获得所有剩余的字符串,并将逗号替换为其他逗号像冒号:这样的分隔符。 例如:

value1, value2, value3, value4.1,value4.2,value4.3 --> value1, value2, value3, value4.1-value4.2-value4.3

此刻,我仍然不知道从哪里开始。 欢呼!!

JSFiddle提供理想的输出:

http://jsfiddle.net/xpvt214o/690880/

1 个答案:

答案 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)));
                }
            });

正如我在上一个问题中所述,要实现所需的功能,必须首先映射这些值,然后打印这些信息。请注意,为了方便更改,我用新变量separatoragregator更改了代码。 同样,如果您知道我的意思,那么该溢出解决方案只会将“丢失的情况”包装到最后一个标头中。 当您得到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>