【问题标题】:Shell script - convert Excel (xlsx) to CSV - remove blank space / tab spaceShell 脚本 - 将 Excel (xlsx) 转换为 CSV - 删除空格/制表符空间
【发布时间】:2016-02-24 11:37:30
【问题描述】:

我收到了包含我的项目的多张工作表的 excel 文件 (xslx)。这些工作表上的记录数量从每张工作表 15k 到 70k 不等。我需要对此数据执行以下任务,然后将其转换为 CSV。或者转换为 CSV,然后以任何方式处理数据。

输入示例:

call_no  uniq_no  Type  Strength    Description
2456     15       TX    SomeSting        SomeSting
5263     15       BLL      SomeSting   SomeSting
4263     162      TX                SomeSting
2369     215      LH    SomeSting
4269     426      BLL   SomeSting       SomeSting
7412     162      TX    SomeSting   SomeSting

根据我需要的要求

  1. 在“uniq_no”列中查找重复值并删除除原始记录(第一条记录)之外的所有重复记录。
  2. 用数据替换空白。 (只需简单的查找空白并用值逻辑替换)
  3. 删除任何单元格中的空格/制表符空格。 (这点不重要,就像一个支线任务)

输出示例:

call_no  uniq_no  Type  Strength    Description
2456     15       TX    SomeSting   SomeSting
4263     162      TX    **NewDATA** SomeSting
2369     215      LH    SomeSting   **NewDATA**
4269     426      BLL   SomeSting   SomeSting

这对我来说是例行任务。我对 shell 脚本有相当的了解。因此,如果有人可以指导我,即使是粗略的脚本大纲,我也可以在最后进行调整。请帮忙。

【问题讨论】:

    标签: excel shell csv unix ubuntu


    【解决方案1】:

    更新:脚本的所需平台已得到澄清, 响应不再适用。但是,我将在此处留下此回复,以防将来查看此问题的人偶然发现它并发现它有用。任何用 Ubuntu 语言编写 shell 脚本的人都可以移植这个 vbscript 的某些方面。

    这里有一些东西可以帮助您入门。如果您使用 Excel 的宏记录器记录操作,请记住在 VBS 中使用相同的命令意味着您必须摆脱所有命名参数。

    prep_xlsx.vbs

    Set objExcel = WScript.CreateObject ("Excel.Application")
    
    objExcel.Visible = true 'False  'True for testing
    
    strFileName = "c:\tmp\vbs_test.xlsx"
    
     set objWb = objExcel.WorkBooks.open(strFileName)
     set objWs = objWb.Worksheets(1)
    
    with objWs
        with .cells(1, 1).CurrentRegion
            .Cells.SpecialCells(4) = "**NewDATA**"  ' 4 is xlCellTypeBlanks
            .Cells.RemoveDuplicates 2, 1                ' Columns:=2, Header:=xlYes
            for c = 1 to .Columns.Count
                with .columns(c)
                    .TextToColumns .Cells(1), 2 ', Array(0, 1)  'Range("C1"), DataType:=xlFixedWidth, FieldInfo:=Array(0, 1)
                end with
            next    'next c
        end with
    end with
    
    objWb.Close True   'save on close
    
    objExcel.Quit
    Set objExcel = Nothing
    

    需要注意的是,如果前导空格太多,使用带有 xlFixedWidth 的 Range.TextToColumns method 删除前导/尾随空格可能会尝试将列拆分为两列。目前,这将停止该过程,因为它将要求确认覆盖下一列的值(您不想这样做)。必须有大量空格才能让 Excel 猜测它属于两列,因此除非空格比典型单词多,否则无需担心;只是需要注意的事情。例如如果 D6 中有两倍多的前导空格,则可能需要拆分为两列。

        
            vbs_test.xlsx 在 prep_xlsx.vbs 之前

        
            vbs_test.xlsx 之后 prep_xlsx.vbs

    【讨论】:

    • 谢谢,但您已在 VB 脚本中提供了解决方案。我完全在 linux(debian) 平台上工作,所以我将无法使用它。我需要为此编写一个 shell 脚本并安排一个 cron 作业。此外,我对 vb/.net 知之甚少。你知道 shell 中的 unix shell 中的任何并行命令或函数可以给我相同的输出吗?
    • 您需要做的第一件事是选择一个您熟悉的脚本平台,并将其添加到与您的问题相关的技术标签中。我错误地添加了[vb-script];你应该删除它。添加一个您希望在其中看到答案的语言标签。更好的是,在您编辑问题中的标签时,提供您迄今为止提出的内容,并在叙述中注明您选择的脚本语言。如果一开始就完成了其中任何一项,我就不会浪费我的时间和你的时间来提供一个你没有用的答案。
    • 抱歉 Jeeped,我没有正确编辑标签,但我在主题和正文中提到了 shell 脚本,但我想这对于寻找主题的人来说仍然是有用的信息
    • 不用担心;只是想为您的问题提供一个有针对性的答案。我把 'shell script' 误认为 [vb-script] 因为 vbscript 不在 Excel 的 VBA 中运行。它在自己的命令解释器 (WSCRIPT) 或命令外壳 (CSCRIPT) 中运行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-12
    • 2017-06-24
    相关资源
    最近更新 更多