如何从REPL控制台使用PowerShell将特定的CSV列转换为TitleCase?

1cosmwyk  于 2023-06-19  发布在  Shell
关注(0)|答案(3)|浏览(105)

根据提供的答案修订工作:

PS /home/nicholas/powershell> 
PS /home/nicholas/powershell> Get-Content ./case.csv  | ForEach-Object ToUpper                            
FJKDLA,W
FKDSLAJF,FDJK;A
NLK;NBF;SDJF,DGDF
VNL;KKDF,BGNGFN
NVCL;V,RGS
NVKL;,THRN
VLKDF,TMMJYMF
FJDK,FDJK;A
PS /home/nicholas/powershell> 
PS /home/nicholas/powershell> Get-Content ./case.csv  | ForEach-Object ToLower 
fjkdla,w
fkdslajf,fdjk;a
nlk;nbf;sdjf,dgdf
vnl;kkdf,bgngfn
nvcl;v,rgs
nvkl;,thrn
vlkdf,tmmjymf
fjdk,fdjk;a
PS /home/nicholas/powershell> 
PS /home/nicholas/powershell> $TextInfo = (New-Object System.Globalization.CultureInfo("en-US")).TextInfo;
PS /home/nicholas/powershell> 
PS /home/nicholas/powershell> Get-Content ./case.csv  | ForEach-Object ToTitleCase                         
PS /home/nicholas/powershell> 
PS /home/nicholas/powershell> pwsh --version
PowerShell 7.3.4
PS /home/nicholas/powershell> 
PS /home/nicholas/powershell> lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 23.04
Release:    23.04
Codename:   lunar
PS /home/nicholas/powershell>

我主要关心的是更多地转换为TitleCase,理想情况下,从REPL控制台而不是脚本文件。我还没能更新针对某个特定栏目的工作。
我所说的REPL控制台指的是交互式shell,如果这有意义的话。
所有的答案和评论都非常有帮助和赞赏。
附加信息:

PS /home/nicholas/powershell> 
PS /home/nicholas/powershell> Get-Culture                                        

LCID             Name             DisplayName
----             ----             -----------
1033             en-US            English (United States)

PS /home/nicholas/powershell> 
PS /home/nicholas/powershell> (Get-Culture).TextInfo.ToTitleCase($_.fjkdla) 

PS /home/nicholas/powershell> 
PS /home/nicholas/powershell> (Get-Culture).TextInfo.ToTitleCase("hmm")     
Hmm
PS /home/nicholas/powershell>

它看起来是单个字符串的所需输出。但是,我不知道如何从控制台迭代上面的CSV文件。

u1ehiz5o

u1ehiz5o1#

  • 更新 * 以回应现已大幅更改的问题:
  • 您最初的问题,仍然反映在标题中,是关于 CSV 数据,并针对 * 特定 * 列。考虑到您最初使用的是Import-Csv,需要使用 OO 方法,如下一节所示。
  • 要定位一个 * 特定列 *,你需要知道它的 * 确切名称 *(除非这种情况无关紧要)。
  • 如果您的CSV文件 * 缺少标题 *,即初始行 * 和列名 *,您需要:
  • 通过Import-Csv-Header参数手动提供列名,例如:Import-Csv ./case.csv -Header Name, Value
  • 然后在ForEach-Object脚本块中引用这些列名,如下所示(例如,$_.Name
  • 您更新的问题使用Get-Content对CSV文件进行 * 纯文本 * 处理,似乎试图将 * 所有 * 列值转换为标题大小写;为此,采用以下方法:
$textInfo = (Get-Culture).TextInfo
 Get-Content ./case.csv | ForEach-Object { $textInfo.ToTitleCase($_) }

 # Alternatively, if performance doesn't matter and you don't want to 
 # create an aux. variable, to reduce the interactive typing effort:
 Get-Content ./case.csv | ForEach-Object { (Get-Culture).TextInfo.ToTitleCase($_) }
原始OO问题的答案:

要在单个管道中将 * 单个已知 * 列转换为标题大小写请确保使用其 * 确切的名称*(尽管大小写无关紧要);以示例CSV的第一列名称为例:

Import-Csv ./case.csv |
  ForEach-Object {
    $_.fjkdla = (Get-Culture).TextInfo.ToTitleCase($_.fjkdla)
    $_ # Output the modified object.
  }

输出从CSV文件解析的修改对象并直接输出;默认情况下,它们会打印到屏幕上;例如,将$csv =前置到流水线,以在变量$csv中捕获其输出。
注意事项:

  • 如果你已经导入了CSV文件并将结果对象保存到数组$csv中,那么iRon's建议是一个简单有效的解决方案,使用内在的.ForEach()方法:
# Transforms the objects stored in $csv in-place.
$csv.ForEach({ $_.fjkdla = (Get-Culture).TextInfo.ToTitleCase($_.fjkdla) })

要有条理地all 列转换为title case,而不需要提前知道列(属性)的值,使用内在的psobject属性:

Import-Csv ./case.csv |
  ForEach-Object {
    # Iterate over all properties and modify their values.
    foreach ($prop in $_.psobject.Properties) {
      $prop.Value = (Get-Culture).TextInfo.ToTitleCase($prop.Value)
    }
    $_ # Output the modified object.
  }

注意事项:

  • 为了简单起见并最小化交互式键入工作量,上述解决方案调用Get-Culture以不仅为每个对象获得标题大小写方法,而且在最后一种情况下,还为每个对象的每个属性获得标题大小写方法,这是低效的。
    性能更好的替代方法,缓存一个方法的引用,然后用.Invoke()调用:
$titleCaseMethod = (Get-Culture).TextInfo.ToTitleCase
Import-Csv ./case.csv |
  ForEach-Object {
    # Iterate over all properties and modify their values.
    foreach ($prop in $_.psobject.Properties) {
      $prop.Value = $titleCaseMethod.Invoke($prop.Value)
    }
    $_ # Output the modified object.
  }
fcipmucu

fcipmucu2#

Replit PowerShell控制台上似乎不存在Get-Culture PowerShell cmdlet。它有一个TextInfo方法,可以用来获取Title Case,如@mklement所示。下面的代码在Replit控制台中为我工作。
CSV文件:

Name,Column2
TEsT tEST TeST,stuff
tEST2 TesT2 test2,more stuff

REPLIT控制台代码:

$TextInfo = (New-Object System.Globalization.CultureInfo("en-US")).TextInfo;

$csv = Import-Csv -Path 'REPL.csv' | 
    ForEach-Object { 
        $_.Name = $TextInfo.toTitleCase($_.Name)
        $_ 
    }

$csv

输出:

Name                                       Column2                                  
----                                       -------                                  
Test Test Test                             stuff                               
Test2 Test2 Test2                          more stuff
cdmah0mi

cdmah0mi3#

这似乎起作用:

PS C:\Users\Nick\Documents>
PS C:\Users\Nick\Documents> $csv = import-csv .\abcd.csv
PS C:\Users\Nick\Documents>
PS C:\Users\Nick\Documents> $csv

alpha       beta       charlie    delta
-----       ----       -------    -----
sdkljgsdf   bdgfhgfnhm ngfgfddfsg dfhgsdfg
gfjd;saklbf dfbdfgfn   vfsdafdfbn fgjtyj
bdgfkl;     dsfsd      vgngfas    dsfhgtj
dsbmnkl     nggfn      bfdsda     edtshdgf
asdfkl      sdagfdfh   vbdfdngt   ngfggj

PS C:\Users\Nick\Documents>
PS C:\Users\Nick\Documents> $textInfo = (Get-Culture).TextInfo
PS C:\Users\Nick\Documents>
PS C:\Users\Nick\Documents> $csv | ForEach-Object { $_.alpha = $textInfo.ToTitleCase($_.alpha) }
PS C:\Users\Nick\Documents>
PS C:\Users\Nick\Documents> $csv

alpha       beta       charlie    delta
-----       ----       -------    -----
Sdkljgsdf   bdgfhgfnhm ngfgfddfsg dfhgsdfg
Gfjd;Saklbf dfbdfgfn   vfsdafdfbn fgjtyj
Bdgfkl;     dsfsd      vgngfas    dsfhgtj
Dsbmnkl     nggfn      bfdsda     edtshdgf
Asdfkl      sdagfdfh   vbdfdngt   ngfggj

PS C:\Users\Nick\Documents>

至少对我来说是这样。使用不同的PC。

相关问题