重新格式化CSV文件

时间:2020-10-27 10:29:22

标签: powershell

第一次来这里,动力壳上的菜鸟,请保持温柔。

我有一个看起来像这样的CSV文件。

目标孔位​​置(标签),试剂(无体积),完整(成分+试管)ID
A1,RdRP,Sample1
B1,RdRP,Sample2
C1,RdRP,Sample3
D1,RdRP,Sample4
E1,RdRP,Sample5

我需要对其进行处理,以使其看起来像这样

行,列,*目标名称,*样本名称
A,1,RDRP,Sample1
B,1,RDRP,Sample2
C,1,RDRP,Sample3
D,1,RDRP,Sample4
E,1,RDRP,Sample5

然后是输出名称:blabla.csv。

我开始这样做:

$CVSOutput = '\test.csv'
$CVSInput = '\Export.csv'
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $true
$workbook = $excel.Workbooks.Open($CVSOutput)

$workbook.ActiveSheet.Cells.Item(1,1) = 'Row,Column,*Target Name,*Sample Name'

$Workbook2 = $excel.Workbooks.open($CVSInput)

$Worksheet = $Workbook2.WorkSheets.item(“Export”)
$Worksheet.activate()
$range = $WorkSheet.Range(“A2:A10”).CurrentRegion
$range.Copy() | out-null
$Worksheet2 = $Workbook.Worksheets.item(“test”)
$worksheet2.activate()
$range2 = $Worksheet2.Range(“A2:A10”)
$Worksheet2.Paste($range2)
$workbook.Save()
$workbook.close($false)
$Excel.Quit() 

我完全有可能在错误的路径上实现即时消息,并尝试了更多。.其他人对此都有自己的想法。

3 个答案:

答案 0 :(得分:2)

iRon's answer简洁明了,但在这种情况下,您的文件带有(而不是难看的)标题。 为了使转换此代码的代码对您更具可读性,建议您使用ForEach-Object循环转换输入数据。

类似

$result = Import-Csv -Path 'D:\Test\TheInputFile.csv' | ForEach-Object {
    # -match creates $matches objects, in this case no. 1 --> Row letter(s) and no. 2 --> Column index
    $null = $_.'Destination Well Position (Label)' -match '([a-z]+)(\d+)'
    # output an object with the new columns and rename the others
    $_ | Select-Object @{Name = 'Row'; Expression = {$matches[1]}},
                       @{Name = 'Column'; Expression = {$matches[2]}},
                       @{Name = 'Target Name'; Expression = {$_.'Reagents (no vol)'}},
                       @{Name = 'Sample Name'; Expression = {$_.'Full (Constituent + Tube) ID'}}
}

# output on screen
$result | Format-Table -AutoSize

# write to new csv
$result | Export-Csv -Path 'D:\Test\TheResult.csv' -UseCulture -NoTypeInformation

屏幕输出:

Row Column Target Name Sample Name
--- ------ ----------- -----------
A   1      RdRP        Sample1    
B   1      RdRP        Sample2    
C   1      RdRP        Sample3    
D   1      RdRP        Sample4    
E   1      RdRP        Sample5  

当然,您需要更改输入csv文件('D:\ Test \ TheInputFile.csv')和输出文件('D:\ Test \ TheResult.csv')的路径以匹配您的环境

我添加了开关-UseCulture,因此输出csv中使用的定界符将与本地Excel期望的定界符相同。如果系统中的分隔符是逗号,则可以将其省略

答案 1 :(得分:0)

您无需为此使用Excel cmdlet:

$Test = ConvertFrom-CSV -Header RC,Target,Sample @'
A1,RdRP,Sample1
B1,RdRP,Sample2
C1,RdRP,Sample3
D1,RdRP,Sample4
E1,RdRP,Sample5
'@

$Test | Select-Object @{ n="Row"; e={ $_.RC -replace '\d' } }, 
                      @{ n="Column"; e={ $_.RC -replace '\D' } }, 
                      Target, Sample

Row Column Target Sample
--- ------ ------ ------
A   1      RdRP   Sample1
B   1      RdRP   Sample2
C   1      RdRP   Sample3
D   1      RdRP   Sample4
E   1      RdRP   Sample5

说明:

  • 这些@{ n="Row"; e={ $_.RC -replace '\d' } }Calculated properties
  • 在计算出的属性中,可以使用regular expression并删除例如-replace '\d'列中的所有数字(RC)并将其分配给新的"Row"n="Row")列

答案 2 :(得分:0)

它改用VBscript解决。