gpt4 book ai didi

csv - 使用 Powershell 从 CSV 文件中删除列

转载 作者:行者123 更新时间:2023-12-05 01:28:42 26 4
gpt4 key购买 nike

我需要从 CSV 文件中删除几列而不在 Powershell 中导入 CSV 文件。下面是我的输入 CSV 的示例以及我希望输出 CSV 的样子。

输入.csv

A,1,2,3,4,5

乙、6、7、8、9、10

C、11、12、13、14、15

D、15、16、17、18、19、20

理想输出.csv

A,3,5

乙、8、10

C,13,15

D,17,20

我曾尝试使用以下代码执行此操作,但它给了我很多错误,并说我不能以这种方式使用“删除”方法(我过去曾这样做过)......有任何想法吗?

$Workbook1 = $Excel.Workbooks.open($file.FullName) 
$header = $Workbook1.ActiveSheet.Range("A1:A68").EntireRow
$unneededcolumns1 = $Workbook1.ActiveSheet.Range("A1:O1").EntireColumn
$unneededcolumns2 = $Workbook1.ActiveSheet.Range("B1:K1").EntireColumn
$unneededcolumns3 = $Workbook1.ActiveSheet.Range("F1:I1").EntireColumn
$unneededcolumns4 = $Workbook1.ActiveSheet.Range("G1:I1").EntireColumn
$unneededcolumns5 = $Workbook1.ActiveSheet.Range("H1:O1").EntireColumn
$unneededcolumns6 = $Workbook1.ActiveSheet.Range("J1:AL1").EntireColumn
$unneededcolumns7 = $Workbook1.ActiveSheet.Range("K1").EntireColumn
$unneededcolumns8 = $Workbook1.ActiveSheet.Range("L1:AK1").EntireColumn
$unneededcolumns9 = $Workbook1.ActiveSheet.Range("F1:I1").EntireColumn
$unneededcolumns10 = $Workbook1.ActiveSheet.Range("M1:AB1").EntireColumn
$unneededcolumns11 = $Workbook1.ActiveSheet.Range("N1:X1").EntireColumn
$unneededcolumns12 = $Workbook1.ActiveSheet.Range("O1:BA1").EntireColumn
$unneededcolumns13 = $Workbook1.ActiveSheet.Range("P1:U1").EntireColumn
$header.Delete()
$unneededcolumns1.Delete()
$unneededcolumns2.Delete()
$unneededcolumns3.Delete()
$unneededcolumns4.Delete()
$unneededcolumns5.Delete()
$unneededcolumns6.Delete()
$unneededcolumns7.Delete()
$unneededcolumns8.Delete()
$unneededcolumns9.Delete()
$unneededcolumns10.Delete()
$unneededcolumns11.Delete()
$unneededcolumns12.Delete()
$unneededcolumns13.Delete()

$Workbook1.SaveAs("\\output.csv")

最佳答案

无论如何,我只是要添加这个,因为我希望说服您避免使用 Excel 是多么容易。

$source = "c:\temp\file.csv"
$destination = "C:\temp\newfile.csv"
(Import-CSV $source -Header 1,2,3,4,5,6 |
Select "1","4","6" |
ConvertTo-Csv -NoTypeInformation |
Select-Object -Skip 1) -replace '"' | Set-Content $destination

我们为对象分配任意标题,这样我们就可以按位置调用第 1、4 和 6 列。导出后,文件将包含以下内容,这些内容与我认为您想要的内容相匹配,而不是您在问题中所拥有的内容。你的最后一行有一个额外的值 (20),我不知道它是否是故意的。

A,3,5
B,8,10
C,13,15
D,17,19

如果这不可行,我真的很想知道为什么。

Excel方法

好的,所以文件很大,所以 Import-CSV 不是一个可行的选择。与你的 excel 想法保持一致,我想出了这个。它将做的是获取列索引并删除不在这些索引中的任何列。

等等你说?...这不会起作用,因为列索引会在您删除列时发生变化。使用我们想要保留的索引,我们可以根据 UsedRows 得到要删除的倒数。的工作表。然后我们将这些列中的每一列删除并删除等于数组位置的值。原因是当一列被实际删除时,下一个值已经被调整以考虑到这种转变。

$file = "c:\temp\file.csv"
$ColumnsToKeep = 1,4,6

# Create the com object
$excel = New-Object -comobject Excel.Application
$excel.DisplayAlerts = $False
$excel.visible = $False

# Open the CSV File
$workbook = $excel.Workbooks.Open($file)
$sheet = $workbook.Sheets.Item(1)

# Determine the number of rows in use
$maxColumns = $sheet.UsedRange.Columns.Count

$ColumnsToRemove = Compare-Object $ColumnsToKeep (1..$maxColumns) | Where-Object{$_.SideIndicator -eq "=>"} | Select-Object -ExpandProperty InputObject
0..($ColumnsToRemove.Count - 1) | %{$ColumnsToRemove[$_] = $ColumnsToRemove[$_] - $_}
$ColumnsToRemove | ForEach-Object{
[void]$sheet.Cells.Item(1,$_).EntireColumn.Delete()
}

# Save the edited file
$workbook.SaveAs("C:\temp\newfile.csv", 6)

# Close excel and release the com object.
$workbook.Close($true)
$excel.Quit()
[void][System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel)
Remove-Variable excel

即使在阅读 "correct" way to do it 后,我仍然遇到 Excel 保持打开的问题。 .内在逻辑才是最重要的。不要忘记根据需要更改路径。

关于csv - 使用 Powershell 从 CSV 文件中删除列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31325586/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com