在javascript中删除行开头的逗号

时间:2011-12-05 13:10:56

标签: javascript regex

我正在尝试从动态生成的表创建一个CSV文件。我有一个生成合理CSV的代码。代码的输出是

, Emp I D, Emp Name, Emp Title,
, 111 , andro1 , developer ,
, 112 , andro2 , developer ,
, 113 , andro3 , developer ,

我想删除每行开头的逗号,以便csv格式正确。我也想整齐地格式化这个CSV,以便在excel中正确打开(标题为粗体,间隔良好的coulmns等)

我正在粘贴我使用的示例javascript


      

  //Modify the value of these variable for your coach
  var tableIdsToExport = "Table0";  

  // a comma delimited list of the ids of the tables that you want to include in the excel export
  // if you include a tableId that does not exist in your coach, you will recieve a client side error message


  //You do not need to modify the following part of the script

  var form = document.createElement('div');
  form.innerHTML = '<form name="exportData" method="post" target="_new" action="data-redirect.jsp"><input type="hidden" name="contentType" value="text/csv"><input type="hidden" name="data" value=""><input type="hidden" name="fileName" value="filename=reportData.csv"></form>';
  //Work around a bug in IE: http://support.microsoft.com/default.aspx/kb/927917
  document.getElementsByTagName("H1")[0].appendChild(form);
  //document.body.appendChild(form);

  function addExportData(csvTable) {
     if (document.forms.exportData == null || document.forms.exportData.data == null) {
         return;
     }
     document.forms.exportData.data.value = document.forms.exportData.data.value +
        "\n\n" + csvTable;  
  }
  function doSubmitExport() {
    var tableArr = tableIdsToExport.split(",");
    for (var i=0;i<tableArr.length;i++) {
      addTableToCSV(tableArr[i]);
      alert(addTableToCSV(tableArr[i]));
    }
    document.forms["exportData"].submit();
  }

  function addTableToCSV(tableId) {
    var table;

    try {
      table = document.getElementById(tableId);

      var a = table.innerHTML;

      //replace existing commas with semi-colons. Poor mans way of handling embedded commas in a csv file
      a = a.replace(/,/g, ";");

      //get rid of javascript blocks
      a = a.replace(/<script(.|\n)*?<\/script>/gi, "");

      //insert commas at the end of a table cell
      a = a.replace(/<\/td>/g, ",");
      a = a.replace(/<\/TD>/g, ",");
      a = a.replace(/<\/th>/g, ",");
      a = a.replace(/<\/TH>/g, ",");

      //insert a newline tag at the end of every row. Need to do this before removing all tags
      a = a.replace(/<\/tr>/g, "---newline---");
      a = a.replace(/<\/TR>/g, "---newline---");

      //remove html tags
      a = a.replace(/<\/?[^>]+(>|$)/g, "");

      //remove whitespace (regexs found via google)
      a = a.replace(/\r/g, " ");
      a = a.replace(/[^ A-Za-z0-9`~!@#\$%\^&\*\(\)-_=\+\\\|\]\[\}\{'";:\?\/\.>,<]/g, "");
      a = a.replace(/'/g, "");
      a = a.replace(/ +/g, " ");  
      a = a.replace(/^\s/g, "");
      a = a.replace(/\s$/g, "");    

      //put newlines in
      a = a.replace(/---newline---/g, "\n");

      //replace &nbsp which the coach designer inserts
      a = a.replace(/\&nbsp;/g, " ");

      //a now holds a resonable csv that I can put in excel
      //alert(a);
      addExportData(a);
      return true;
    } catch (e) {
      alert("Table Export Error: " + e);
    }
    return true;
  }
</script>

还有一件事是,在表中有一列是空的。这就是脚本在开始时返回逗号的原因,我想删除它。 当我尝试在excel中打开csv时,内容从第三行而不是第一行开始。

这正在IBM BPM Lombardi应用程序中使用,我试图将动态生成的表导出为ex​​cel。

我还想知道如何通过jquery实现相同的结果 提前致谢

完成此操作后,我还计划导出为pdf选项。

以下表达了脚本中正在进行的操作

执行导出的关键组件是包含客户端JavaScript的自定义HTML代码块。 JavaScript包含以下组件:

1.A JavaScript变量tableIdsToExport。这是一个以逗号分隔的字符串,用于逐项列出要导出的表元素ID。您必须确保ID与Coach中的ID匹配。

2.一种JavaScript变量形式,它是动态生成的HTML表单元素(不可显示)。此表单的action属性的URI是将返回电子表格的Teamworks JSP。此表单还包含一个输入字段数据,其中包含要导出的表。

3.“导出到Excel”按钮。选择此按钮后,将执行doSubmitExport功能。

4.doSubmitExport函数。该函数的算法执行两个任务。首先,它遍历tableIdsToExport中的每个表并调用addTableToCSV函数。迭代完成后,函数提交表单变量中包含的表单元素(上图)。

5.addTableToCSV功能。为tableIdsToExport列表中的每个表调用此函数,并具有两个要执行的基本任务。首先,转换HTML表格,以便用逗号和换行符替换表格元素,从而有效地将表格转换为CSV格式。接下来,调用addTableToExport函数,并将转换后的表作为参数传递。

6.addTableToExport函数。此函数采用CSV参数并将其附加到隐藏表单的数据字段。 提交后,表单将发布到Teamworks data-redirect.jsp,后者将应用相应的内容类型并将数据发送回浏览器。

2 个答案:

答案 0 :(得分:2)

我同意David Thomas的看法,他说你应该在CSV生成脚本中解决问题。

但是如果您无法控制该脚本,则可以在javascript regular expressions中使用replace()将第一次出现的逗号替换为空字符串(将其删除):

", 111 , andro1 , developer ,".replace(/^,/, '');

返回:

" 111 , andro1 , developer ,"

<强>更新

Here你可以看到一个javacript演示,删除第一个逗号,并将所有列调整到预定义的最大宽度。

由于您没有jQuery标记,我假设您需要纯Javascript,但请记住,使用jQuery会更容易。

您可以从演示中看到的最终输出是

     EmpID,   EmpName,  EmpTitle,          
       111,    andro1, developer,          
       112,    andro2, developer,          
       113,    andro3, developer,

在这种情况下,我正确地将每列定义为10个字符。

关于粗体列标题,这是CSV格式无法实现的,因为CSV是纯文本格式。您可以考虑这个xlwt

同样,我同意您应该从生成脚本中解决此格式问题,但如果您只是这些文件的使用者并希望在javascript中修复它们,那么此解决方案应该适合您。


更新2 你需要清理那个javascript。请阅读我上面包含的正则表达式链接。

你可以替换它:

a = a.replace(/<\/td>/g, ",");
a = a.replace(/<\/TD>/g, ",");
a = a.replace(/<\/th>/g, ",");
a = a.replace(/<\/TH>/g, ",");

只是这个:

a = a.replace(/<\/t(d|h)>/gi, '');

为什么要用</tr>替换</TR>--newline--,然后又用--newline--替换\n?您只需一次通话即可完成此操作:

a = a.replace(/<\/tr>/gi, '\\n');

所以,我认为你最终得到一个包含所有csv内容的字符串,其中每一行用\n分隔。

Here是处理此用例的更新脚本。我只更改了var声明,核心保持不变。

答案 1 :(得分:0)

对于格式化表达式,正则表达式不会帮助您解决问题。必须在CSV生成脚本中完成格式化。