【问题标题】:Powershell Split 1 column into 2 columnsPowershell 将 1 列拆分为 2 列
【发布时间】:2021-12-07 16:04:31
【问题描述】:

我熟悉 -split 运算符以及如何拆分字符串,但我不知道如何将字符串拆分为一列并将其变成 2 个单独的列

数据:

"MPN","Item_Description","Customer_Order"
"000501","BLU 60MM Slate Shale Grey (116.82 sqft/pallet - 10.62 sqft/layer)","12055"
"000501","BLU 60MM Slate Shale Grey (116.82 sqft/pallet - 10.62 sqft/layer)","12421"
"000501","BLU 60MM Slate Shale Grey (116.82 sqft/pallet - 10.62 sqft/layer)","12424"
"002243","Mini-Creta Architectural 6'' Champlain Grey (30 sqft/pallet - 6 sqft/layer)","12014"
"002243","Mini-Creta Architectural 6'' Champlain Grey (30 sqft/pallet - 6 sqft/layer)","12425"
"002243","Mini-Creta Architectural 6'' Champlain Grey (30 sqft/pallet - 6 sqft/layer)","12817"

我正在尝试弄清楚如何将“Item_Description”列中“(”和“sqft/pallet”之间的数据拆分或复制到它自己的列中。

我最大的障碍是拆分它,然后将其作为新列添加回来,并带有一个新标题,如下所示:

"MPN","Item_Description","Sqft_Pallet","Customer_Order"
"000501","BLU 60MM Slate Shale Grey (116.82 sqft/pallet - 10.62 sqft/layer)","116.82","12055"
"000501","BLU 60MM Slate Shale Grey (116.82 sqft/pallet - 10.62 sqft/layer)","116.82","12421"
"000501","BLU 60MM Slate Shale Grey (116.82 sqft/pallet - 10.62 sqft/layer)","116.82","12424"
"002243","Mini-Creta Architectural 6'' Champlain Grey (30 sqft/pallet - 6 sqft/layer)","30","12014"
"002243","Mini-Creta Architectural 6'' Champlain Grey (30 sqft/pallet - 6 sqft/layer)","30","12425"
"002243","Mini-Creta Architectural 6'' Champlain Grey (30 sqft/pallet - 6 sqft/layer)","30","12817"

【问题讨论】:

  • 到目前为止你的代码是什么?
  • 我的尝试没有成功。我相信我需要在列的每一行上做一个 foreach 循环,但是它改变了一个位形式 split 实际将一个字符串复制到一个 cew 列中
  • 为什么要使用脚本,Notepad++ 有一个 CSV 插件,它有一个拆分列选项 github.com/BdR76/CSVLint 您可以拆分字符 ( 以创建一个新列

标签: powershell csv split


【解决方案1】:

您可以将计算属性与Select-Object 一起使用。此示例假定 Sqft_Pallet 始终完全包含在括号中:

$CsvData | select MPN,
  Item_Description,
  @{l='Sqft_Pallet';e={
    # Regex is to select anything inside parentheses from Item_Description
    if ($_.Item_Description -match '\(.*\)') {$Matches.Values} 
    else {'N/A'}  ## if no full parentheses present, use N/A
  }},
  Customer_Order

输出如下:

MPN    Item_Description                                                           Sqft_Pallet                             Customer_Order
---    ----------------                                                           -----------                             --------------
000501 BLU 60MM Slate Shale Grey (116.82 sqft/pallet - 10.62 sqft/layer)          (116.82 sqft/pallet - 10.62 sqft/layer) 12055         
000501 BLU 60MM Slate Shale Grey (116.82 sqft/pallet - 10.62 sqft/layer)          (116.82 sqft/pallet - 10.62 sqft/layer) 12421         
000501 BLU 60MM Slate Shale Grey (116.82 sqft/pallet - 10.62 sqft/layer)          (116.82 sqft/pallet - 10.62 sqft/layer) 12424         
002243 Mini-Creta Architectural 6' Champlain Grey (30 sqft/pallet - 6 sqft/layer) (30 sqft/pallet - 6 sqft/layer)         12014         
002243 Mini-Creta Architectural 6' Champlain Grey (30 sqft/pallet - 6 sqft/layer) (30 sqft/pallet - 6 sqft/layer)         12425         
002243 Mini-Creta Architectural 6' Champlain Grey (30 sqft/pallet - 6 sqft/layer) (30 sqft/pallet - 6 sqft/layer)         12817         
002243 Mini-Creta Architectural 6' Champlain Grey 30 sqft/pal                     N/A                                     12817         

【讨论】:

  • 太棒了,我在正则表达式方面总是很挣扎。你能帮我理解 {$Matches.Values} 我想我理解其余的部分。如果我想将正则表达式更改为介于 '(' 和 'sqft/pallet' 之间,它会像这样:'(.*sqft\/pallet')
  • 我见过@{N or Name= 但没有见过{L l 代表什么
  • @moore1emu 请参阅此doc 以了解$matches 自动变量。 L= 代表label=,与n=name= 的用法相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多