0

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

我的手动流程如下:

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

我一直在做什么

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

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

4

2 回答 2

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

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

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

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

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

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

于 2016-10-12T15:19:00.437 回答
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
于 2016-10-11T15:37:08.063 回答