Powershell 用字符串替换最后一个逗号后的最后一个字符

Powershell 用字符串替换最后一个逗号后的最后一个字符,powershell,text,cmd,Powershell,Text,Cmd,我有一个巨大的文本文件,如下所示: 36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,3 36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,8 36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,14 36,53,15596,0.5845457785

我有一个巨大的文本文件,如下所示:

36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,3
36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,8
36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,14
36,53,15596,0.58454577855,0.26119,2.24878677855,0.116147072052964,12
所需的输出如下:

36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,MI-03
36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,MI-08
36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,MI-14
36,53,15596,0.58454577855,0.26119,2.24878677855,0.116147072052964,MI-12
我在这里和其他社区尝试了其他相关的帖子,但没有得到我想要的

更新


这是一个(我需要Unix/perl答案和batch/powershell解决方案)有着有趣答案的代码。

下一个代码做了您想要的事情,除了在小于
10
时用零填充最后一个标记之外,希望它能有所帮助

编辑:我想出了一种方法,在最后一个数字小于10时插入前导零。有点难看,但确实如此。:)

对于文件(本例中为f.txt):

生成以下结果(也在f.txt中):已更新

36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,MI-03
36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,MI-08
36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,MI-14
36,53,15596,0.58454577855,0.26119,2.24878677855,0.116147072052964,MI-12

下一个代码执行您想要的操作,除了在小于
10
时用零填充最后一个标记外,希望有帮助

编辑:我想出了一种方法,在最后一个数字小于10时插入前导零。有点难看,但确实如此。:)

对于文件(本例中为f.txt):

生成以下结果(也在f.txt中):已更新

36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,MI-03
36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,MI-08
36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,MI-14
36,53,15596,0.58454577855,0.26119,2.24878677855,0.116147072052964,MI-12
这是我的交叉问题(我也在寻找unix/perl解决方案)中给出的答案:

带sprintf函数的awk方法(添加前导零):

输出:

36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,MI-03
36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,MI-08
36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,MI-14
36,53,15596,0.58454577855,0.26119,2.24878677855,0.116147072052964,MI-12
这是我的交叉问题(我也在寻找unix/perl解决方案)中给出的答案:

带sprintf函数的awk方法(添加前导零):

输出:

36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,MI-03
36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,MI-08
36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,MI-14
36,53,15596,0.58454577855,0.26119,2.24878677855,0.116147072052964,MI-12

如果你喜欢PS,这里有一个PowerShell答案

Get-Content C:\Path\To\File.csv | 
    Where{$_ -match '^(.*,)([^,]*)$'} | 
    ForEach { "{0}MI-{1}" -f $Matches[1], $Matches[2].Padleft(2,'0') } |
    Set-Content C:\Path\To\NewFile.csv

如果你喜欢PS,这里有一个PowerShell答案

Get-Content C:\Path\To\File.csv | 
    Where{$_ -match '^(.*,)([^,]*)$'} | 
    ForEach { "{0}MI-{1}" -f $Matches[1], $Matches[2].Padleft(2,'0') } |
    Set-Content C:\Path\To\NewFile.csv

这是一个
cmd
批处理文件,它依赖于一个很好的技巧来分割逗号分隔列表的最后一项,这与字符串中出现的逗号数无关。基本技术如下所示;请注意,这需要启用:

set“x=这是原始列表。”
设置“y=”&设置“z=%x:,=”&设置“y=!y!,!z!”&设置“z=%”设置“y=!y:~1!”
回显原件:%x%
回显最后一项:%z%
回显余数:%y%
下面是脚本的代码,将上述方法保存在名为
:GET_LAST_ITEM
的子例程中:

@echo关闭
setlocal EnableExtensions DisableDelayedExpansion
rem//在此处定义常量:
设置“_FILE=%~1”&rem//(通过第一个参数指定CSV文件)
对于/F“usebackq delims=“%%L in”(“%\u FILE%”)do(
调用:获取\u最后\u项最后剩余“%%L”
setlocal EnableDelayedExpansion
设置“LAST=0!LAST!”
回声(!REST!,MI-!LAST:~-2!
端部
)
端部
退出/B
:获取\u LAST\u项目rtn\u LAST rtn\u不带\u LAST val\u字符串
::此函数拆分字符串中最后一个逗号分隔的项。
::请注意,感叹号不能出现在给定的字符串中。
::参数:
::rtn_接收最后一项的最后一个变量
::rtn_没有接收剩余字符串的最后一个变量
::val_字符串原始字符串
setlocal EnableDelayedExpansion
设置“STR=,%~3”
设置“PRE=”&set“END=%STR:,=”&set“PRE=!PRE!,!END!”&设置“END=%”
endlocal&设置“%~1=%END%”和设置“%~2=%PRE:~2%”
退出/B

这是一个
cmd
批处理文件,它依赖于一个好的技巧来分割逗号分隔列表的最后一项,而与字符串中出现的逗号数无关。基本技术如下所示;请注意,这需要启用:

set“x=这是原始列表。”
设置“y=”&设置“z=%x:,=”&设置“y=!y!,!z!”&设置“z=%”设置“y=!y:~1!”
回显原件:%x%
回显最后一项:%z%
回显余数:%y%
下面是脚本的代码,将上述方法保存在名为
:GET_LAST_ITEM
的子例程中:

@echo关闭
setlocal EnableExtensions DisableDelayedExpansion
rem//在此处定义常量:
设置“_FILE=%~1”&rem//(通过第一个参数指定CSV文件)
对于/F“usebackq delims=“%%L in”(“%\u FILE%”)do(
调用:获取\u最后\u项最后剩余“%%L”
setlocal EnableDelayedExpansion
设置“LAST=0!LAST!”
回声(!REST!,MI-!LAST:~-2!
端部
)
端部
退出/B
:获取\u LAST\u项目rtn\u LAST rtn\u不带\u LAST val\u字符串
::此函数拆分字符串中最后一个逗号分隔的项。
::请注意,感叹号不能出现在给定的字符串中。
::参数:
::rtn_接收最后一项的最后一个变量
::rtn_没有接收剩余字符串的最后一个变量
::val_字符串原始字符串
setlocal EnableDelayedExpansion
设置“STR=,%~3”
设置“PRE=”&set“END=%STR:,=”&set“PRE=!PRE!,!END!”&设置“END=%”
endlocal&设置“%~1=%END%”和设置“%~2=%PRE:~2%”
退出/B

所有行是否始终有8个逗号分隔的元素?是的!8个元素。所有行是否始终有8个逗号分隔的元素?是的!8个元素。请不要!@aschipfl我想要unix/perl和powershell/batch解决方案的答案,因为我的同事正在编辑相同的文件,他们的计算机上可能安装了Cygwin,也可能没有安装Cygwin。不过,我完全同意你的理由。请不要!@aschipfl我想要unix/perl和powershell/batch解决方案的答案,因为我的同事正在编辑相同的文件,他们的计算机上可能安装了Cygwin,也可能没有安装Cygwin。不过,我完全同意你的理由。