$lower = Import-Csv "C:\\Users\\X\\Desktop\\U\\cvv.csv" $lower | ForEach-Object { src['A']=src['A'].str[:20].str.lower() } $lower | Export-Csv -Path "C:\\Users\\X\\Desktop\\U\\cvv2.csv"
我试过这个方法,但不管用。我想如果它是超过20个字符删除和匹配它的最大20。
yzuktlbb1#
看起来您混合了Python和PowerShell语法。您可能正在寻找:
$lower = Import-Csv 'C:\Users\X\Desktop\U\cvv.csv' $lower | ForEach-Object { $_.A = $_.A.Substring(0, 20).ToLower() } # ... Export-Csv command omitted.
但是,如果某些属性值的字符数 * 少于 * 20个,则需要做更多的工作,即避免.Substring()方法抛出的异常。
.Substring()
$lower = Import-Csv 'C:\Users\X\Desktop\U\cvv.csv' $lower | ForEach-Object { $val = if ($_.A.Length -gt 20) { $_.A.Substring(0, 20) } else { $_.A } $_.A = $val.ToLower() }
try { $_.A.Substring(0, 20) } catch { $_.A }
if
$_.A.Length -gt 20 ? $_.A.Substring(0, 20) : $_.A
-replace
Factor
1.00
1,000
Factor Secs (50-run avg.) Command ------ ------------------ ------- 1.00 0.001 # .Substring + if... 1.71 0.002 # .Substring + [math]::Min()... 5.24 0.006 # -replace + capture group... 8.32 0.010 # -replace + lookbehind... 160.84 0.198 # .Substring + try... 229.07 0.281 # array slicing + [string]::new()... 294.62 0.362 # array slicing + -join ...
Factor Secs (50-run avg.) Command ------ ------------------ ------- 1.00 0.002 # .Substring + ternary conditional… 1.09 0.002 # .Substring + if… 2.98 0.005 # .Substring + [math]::Min()… 3.79 0.006 # -replace + capture group… 6.64 0.011 # -replace + lookbehind… 132.11 0.215 # array slicing + [string]::new()… 160.99 0.262 # array slicing + -join … 163.68 0.266 # .Substring + try…
*摘要:
try
catch
? :
Time-Command
irm https://gist.github.com/mklement0/9e1f13978620b09ab2d15da5535d1b27/raw/Time-Command.ps1 | iex
# Create 1000 strings, half of which longer than 20 chars., and half shorter. $strs = , ('x' * 30) * 500 + , ('y' * 10) * 500 # Construct an array of script blocks with the various # substring-extraction methods. $cmds = { # -replace + capture group foreach ($s in $strs) { $s -replace '^(.{20}).+', '$1' } }, { # -replace + lookbehind foreach ($s in $strs) { $s -replace '(?<=^.{20}).+' } }, { # .Substring + try foreach ($s in $strs) { try { $s.Substring(0, 20) } catch { $_} } }, { # .Substring + if foreach ($s in $strs) { if ($s.Length -gt 20) { $s.Substring(0, 20) } else { $s } } }, { # .Substring + [math]::Min() foreach ($s in $strs) { $s.Substring(0, [Math]::Min($s.Length, 20)) } }, { # array slicing + -join foreach ($s in $strs) { -join $s[0..19] } }, { # array slicing + [string]::new() foreach ($s in $strs) { [string]::new($s[0..19]) } } # PowerShell (Core): add variant with ternary conditional. if ($IsCoreClr) { # Note: The script block must be constructed *as a string*, # to avoid breaking the parsing stage of the script in Windows PowerShell. $cmds += [scriptblock]::Create(@' # .Substring + ternary conditional foreach ($s in $strs) { $s.Length -gt 20 ? $s.Substring(0, 20) : $s } '@) } # Compare the performance of various substring extraction methods, # averaged over 50 runs. Time-Command -Count 50 $cmds
xuo3flqw2#
我个人会将索引运算符[ ]与范围运算符..结合使用:
[ ]
..
Import-Csv "C:\\Users\\X\\Desktop\\U\\cvv.csv" | ForEach-Object { $_.A = [string]::new($_.A[0..19]).ToLower() # Update the the `A` value $_ # Output the object } | Export-Csv -Path "C:\\Users\\X\\Desktop\\U\\cvv2.csv"
它将处理小于或大于所需长度的字符串:
PS /> 'HELLO WORLD', 'ONLY 20 CHARS LENGTH ALLOWED' | ForEach-Object { [string]::new($_[0..19]).ToLower() } hello world only 20 chars length
2条答案
按热度按时间yzuktlbb1#
看起来您混合了Python和PowerShell语法。
您可能正在寻找:
但是,如果某些属性值的字符数 * 少于 * 20个,则需要做更多的工作,即避免
.Substring()
方法抛出的异常。try { $_.A.Substring(0, 20) } catch { $_.A }
if
语句缩短为:$_.A.Length -gt 20 ? $_.A.Substring(0, 20) : $_.A
可选阅读:比较了各种减法字符串提取方法的性能。
.Substring()
方法-replace
运算符使用regex运算Factor
列中反映的是 * 相对 * 性能(1.00
反映了最快的时间,所有其他值都是它的倍数)。1,000
字符串执行(最多)20个字符的子串提取,其中一半字符串比1,000
字符串长,一半字符串比1,000
字符串短。*重要提示:基准测试将
.Substring()
调用的 * 有条件 * 解决方案与 * 无条件 *-replace
和数组切片解决方案并列,这会使结果发生偏差-要比较真正的子字符串提取性能,后两种方法也需要修改为使用条件。.Substring()
方法使用条件处理的原因是它是一种 * 必要性 *-为了避免例外-而其他方法的吸引力是 * 简洁 *,即 * 不 * 必须使用条件。性能指标评测结果:
*摘要:
.Substring()
的方法是迄今为止最快的--除非与try
/catch
结合使用(异常处理开销很大)。? :
)的执行方式与等效的if
语句大致相同。-replace
的解决方案在捕获组变体中的速度要慢3-5倍,大约是使用look-behindAssert的变体速度的两倍。try
/catch
的解决方案,速度慢了两个数量级。性能指标评测源代码:
Time-Command
。xuo3flqw2#
我个人会将索引运算符
[ ]
与范围运算符..
结合使用:它将处理小于或大于所需长度的字符串: