【问题标题】:Changing commas into colon after third consecutive commas在连续第三个逗号后将逗号更改为冒号
【发布时间】:2020-02-25 23:26:49
【问题描述】:

我根据我之前的问题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/

【问题讨论】:

  • 用逗号分割字符串 (str.split(',')) 并确保在分割后修剪每个元素的任何空白。然后,遍历拆分数组 - 如果元素是索引 = 3 则输出到您的字符串值 + ' --> '。
  • 您想从该 CSV 输入中获得什么输出?
  • @ChrisCousins 这正是我所需要的,我会试一试你所说的,但现在我在想如何加入拆分字符串。
  • @DavidThomas 我在我的理想输出和东西上添加了一个 jsfiddle,希望它能澄清我缺少的东西
  • @ChrisCousins im 使用来自jquery-csv 的方法 csv.toArrays 这在从数据中创建二维数组时很方便,但我不知道如何迭代并同时添加这些将数据溢出到一个单元格中。 jsfiddle.net/xpvt214o/691107

标签: jquery


【解决方案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]}&lt;td&gt;headerName: [headerValues].join(agregator)&lt;/td&gt;

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-26
  • 1970-01-01
相关资源
最近更新 更多