我在尝试从一组文件中的某些货币值中提取数千个分隔符时遇到了问题."坏"值以逗号和双引号分隔.还有其他值<$ 1000,没有任何问题.
现有文件示例:
"12,345.67",12.34,"123,456.78",1.00,"123,456,789.12"
Run Code Online (Sandbox Code Playgroud)
所需文件的示例(删除了千位分隔符):
"12345.67",12.34,"123456.78",1.00,"123456789.12"
Run Code Online (Sandbox Code Playgroud)
我找到了一个正则表达式,用于匹配数字和分隔符,这些分隔符效果很好,但我遇到了-replace运算符的问题.替换价值使我感到困惑.我读了大约$&,我想知道我是否应该在这里使用它.我尝试了$ _,但是我的所有逗号都被删除了.我不得不以某种方式使用$ match?
这是我的代码:
$Files = Get-ChildItem *input.csv
foreach ($file in $Files)
{
$file |
Get-Content | #assume that I can't use -raw
% {$_ -replace '"[\d]{1,3}(,[\d]{3})*(\.[\d]+)?"', ("$&" -replace ',','')} | #this is my problem
out-file output.csv -append -encoding ascii
}
Run Code Online (Sandbox Code Playgroud)
Tony Hinkle的评论是答案:不要使用正则表达式(至少不要直接在CSV文件上).
您的CSV有效,因此您应该对其进行解析,处理对象(如果需要,可以更改文本),然后编写新的CSV.
Import-Csv -Path .\my.csv | ForEach-Object {
$_ | ForEach-Object {
$_ -replace ',',''
}
} | Export-Csv -Path .\my_new.csv
Run Code Online (Sandbox Code Playgroud)
(此代码需要工作,特别是中间,因为行将每列作为属性,而不是数组,但更完整的CSV版本将使其更容易演示)
你可以尝试使用这个正则表达式:
,(?=(\d{3},?)+(?:\.\d{1,3})?")
Run Code Online (Sandbox Code Playgroud)
请参阅现场演示或在 powershell 中:
% {$_ -replace ',(?=(\d{3},?)+(?:\.\d{1,3})?")','' }
Run Code Online (Sandbox Code Playgroud)
但更多的是正则表达式带来的挑战。为了正确工作,请使用 @briantist 答案,这是执行此操作的干净方法。