我有一个(希望)快速的问题,我似乎无法独立完成。
我有一个字符串:
ITEM1数量:12x 355ml bottle价格:$ 23.95 $ 23.50节省$ 0.45
我想拆分并插入CSV文件。生成的CSV中的列及其值将为:
名称:(上述字符串中“Quantity:”之前的所有内容。)
数量:(数量与x之间)
尺寸:(x和瓶子之间的所有内容)
OrigPrice:(价格和第二个$符号后的所有内容)
SalePrice:(OrigPrice和SAVE之间的所有内容)
节省:(“保存”后的所有内容)
我希望这一切都有意义,如果需要,我可以提供更多信息。
我很感激帮助!
答案 0 :(得分:2)
如下:
$subject = 'ITEM1 Quantity: 12x 355ml bottlePrice: $23.95 $23.50 SAVE $0.45'
if ($subject -cmatch '^(?<Name>.*)Quantity:(?<Quantity>.*)x(?<Size>.*)bottle\s*Price:(?<OrigPrice>.*)\s*(?<SalePrice>\$.*)SAVE(?<Savings>.*)$') {
$result = $matches[0]
} else {
$result = ''
}
"Matches:"
$matches
我不知道瓶子和瓶子之间是否真的需要一个空间。价格(它看起来不像,但如果有的话,它会处理它。)
如果您需要该名称,可以像以下一样访问:
$matches["Name"]
一个更好的解决方案(实际上将其转换为CSV格式的解决方案将类似于以下内容(感谢@nickptrvc指出我错过的内容):
function Read-Data {
[cmdletbinding()]
param(
[parameter(Mandatory)][string]$Path
)
$reader = [System.IO.File]::OpenText($Path)
while(( $subject = $reader.ReadLine()) -ne $null ) {
if ($subject -cmatch '^(?<Name>.*)Quantity:(?<Quantity>.*)x(?<Size>.*)bottle\s*Price:(?<OrigPrice>.*)\s*(?<SalePrice>\$.*)SAVE(?<Savings>.*)$') {
$result = $matches[0]
$obj = [PSCustomObject]@{
Name=$matches["Name"].trim();
Quantity=$matches["Quantity"].trim();
Size=$matches["Size"].trim();
OrigPrice=$matches["OrigPrice"].Trim();
SalePrice=$matches["SalePrice"].Trim();
Savings=$matches["Savings"].Trim()
}
$obj
}
}
}
然后,要使用它,将其保存到文件(我称之为我的Read-Data.ps1),获取文件,然后您有两个选项:1)您可以使用ConvertTo-Csv
简单地转换对象为CSV,并将结果返回到屏幕,或者您可以使用Export-Csv
将其保存到文件中:
. C:\Test\Convert-Data.ps1
Read-Data -Path C:\Test\datafile.dat | ConvertTo-Csv -NoTypeInformation
或
Read-Data -Path C:\Test\datafile.dat | Export-Csv -NoTypeInformation -Path C:\Test\datafile.csv