Powershell:将字符串拆分为CSV

时间:2014-02-10 21:13:07

标签: string powershell csv

我有一个(希望)快速的问题,我似乎无法独立完成。

我有一个字符串:

ITEM1数量:12x 355ml bottle价格:$ 23.95 $ 23.50节省$ 0.45

我想拆分并插入CSV文件。生成的CSV中的列及其值将为:

名称:(上述字符串中“Quantity:”之前的所有内容。)

数量:(数量与x之间)

尺寸:(x和瓶子之间的所有内容)

OrigPrice:(价格和第二个$符号后的所有内容)

SalePrice:(OrigPrice和SAVE之间的所有内容)

节省:(“保存”后的所有内容)

我希望这一切都有意义,如果需要,我可以提供更多信息。

我很感激帮助!

1 个答案:

答案 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