自动化流程将制表符分隔文件中的值乘以-1以取消它们

时间:2016-10-11 15:13:16

标签: excel powershell negate

我一直在Excel中手动处理大量文件。我已经做了一些搜索但是没有找到关于如何以自动化方式实现这一过程的明确最佳实践。

我的手动流程如下:

我有.tab(制表符分隔)文件。每行总共有8个“列”。我需要否定每一行的最后5列中的数值。

我一直在做什么

  • 在Excel中打开文件
  • 在任何空白单元格中键入-1。复制它
  • 突出显示最近5列中的数据→右键单击→选择性粘贴→乘法→输入
  • 然后保存文件。

我不确定最好的方法是PowerShell还是替代脚本,所以我想联系社区,了解其他人可能对此有何建议。谢谢你的时间。

2 个答案:

答案 0 :(得分:1)

在PowerShell中,您可以使用Import-Csv进行阅读,使用Export-Csv来编写以字符分隔的文件。两个cmdlet都提供参数-Delimiter,允许您指定分隔符:

$csv = Import-Csv 'C:\path\to\input.csv' -Delimiter "`t"
$csv | Export-Csv 'C:\path\to\output.csv' -Delimiter "`t" -NoType

通过Import-Csv导入CSV会为您提供自定义对象列表,其中CSV中的每个字段都表示为对象的属性。您可以在将数据写回文件之前修改属性的值来修改字段。为此,您可以采用以下两种方法之一:

  • 将CSV完全读入变量,在循环中更新要修改的字段,然后将数据导出回文件:

    $csv = Import-Csv ...
    foreach ($row in $csv) {
      [int]$row.B *= -1
      [int]$row.F *= -1
    }
    $csv | Export-Csv ...
    
  • 将CSV读入管道并通过calculated properties替换您要修改的字段:

    Import-Csv ... |
      Select-Object -Include *,@{n='B';e={-$_.B}},@{n='F';e={-$_.F}} -Exclude B,F |
      Export-Csv ...
    

    请注意,要使其工作,您必须使用单独的输入和输出文件,或将Import-Csv语句放在括号中。否则Export-Csv会失败,因为当Import-Csv仍然从中读取时,它无法写入CSV。

答案 1 :(得分:0)

您可以在工作表上的任何位置记下可以运行此宏的按钮。假设您了解宏/ VBA的基础知识(如果您不让我知道)并且A1 = -1(可以在下面的脚本中更改)。

Range("A1").Select
ActiveCell.FormulaR1C1 = "-1"
Range("B1:F1").Select
Range(Selection, Selection.End(xlDown)).Select
Range("A1").Select
Selection.Copy
Range("B1:F1").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlMultiply, _
    SkipBlanks:=False, Transpose:=False