首页 > 解决方案 > 在连续第三个逗号后将逗号更改为冒号

问题描述

我根据我之前的问题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 用于我的理想输出:

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

标签: jquery

解决方案


好的,我们开始:

            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>.


推荐阅读