2017-04-13 91 views
0

我有一个巨大的文本文件,最后一个逗号后更换最后一个字符,看起来是这样的:用绳子

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 

我已经试过其他相关职位和其他社区,但不能完全得到我想要的。

UPDATE

这是cross-question(我想在Unix/perl的答案,此批/ PowerShell的解决方案。),有有趣的答案。

+0

是否所有的线始终8 - 逗号分隔的元素? – dcg

+0

是的! 8个元素。 – Masoud

回答

2

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

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 
1

下一个代码做的是你想要的,除了用小于10的最后一个标记填充零时,希望它有帮助。

编辑:我想出了一种方法,当最后一个数字小于10时插入一个前导零。有点难看,但是做到了。 :)

@echo off 

setlocal EnableDelayedExpansion 

for /F "delims=, tokens=1-8" %%A in (f.txt) do (
    set /a "t=%%H-10" 
    if "!t:~0,1!" equ "-" (set "n=0%%H") else (set "n=%%H") 
    echo(%%A,%%B,%%C,%%D,%%E,%%F,%%G,MI-!n!>>f.new.txt 
) 

move /Y f.new.txt f.txt >nul 2>&1 

对于文件(在这种情况下f.txt):

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 

产生以下结果(也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 
0

这是@RomanPerekhrest在我的交叉问题提供的答案(正在寻找unix/perl解决方案)here

与sprintf函数0

AWK办法(添加前导零):

awk -F, -v OFS=',' '$8="MI-"sprintf("%02d",$8);' file 

输出:

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 
+0

请不要** [交叉邮件](https://meta.stackexchange.com/q/64068)! – aschipfl

+0

@aschipfl因为我的同事们正在编辑相同的文件,他们可能会或可能没有在他们的机器上安装Cygwin,所以我想要unix/perl和powershell/batch解决方案的答案。完全同意你的原因。 – Masoud

1

下面是依靠一个漂亮的劈分出一个逗号分隔的列表,独立的最后一个项目的逗号发生了多少字符串中cmd批处理文件。基本技术如下所示;注意,这需要delayed expansion启用:

set "x=This,is,the,original,list." 
set "y=" & set "z=%x:,=" & set "y=!y!,!z!" & set "z=%" & set "y=!y:~1!" 
echo ORIGINAL: %x% 
echo LAST ITEM: %z% 
echo REMAINDER: %y% 

因此,这里的脚本代码,拿着一个子程序上述方法称为:GET_LAST_ITEM

@echo off 
setlocal EnableExtensions DisableDelayedExpansion 

rem // Define constants here: 
set "_FILE=%~1" & rem // (specify the CSV file by the first argument) 

for /F "usebackq delims=" %%L in ("%_FILE%") do (
    call :GET_LAST_ITEM LAST REST "%%L" 
    setlocal EnableDelayedExpansion 
    set "LAST=0!LAST!" 
    echo(!REST!,MI-!LAST:~-2! 
    endlocal 
) 

endlocal 
exit /B 


:GET_LAST_ITEM rtn_last rtn_without_last val_string 
::This function splits off the last comma-separated item of a string. 
::Note that exclamation marks must not occur within the given string. 
::PARAMETERS: 
:: rtn_last   variable to receive the last item 
:: rtn_without_last variable to receive the remaining string 
:: val_string   original string 
setlocal EnableDelayedExpansion 
set "STR=,%~3" 
set "PRE=" & set "END=%STR:,=" & set "PRE=!PRE!,!END!" & set "END=%" 
endlocal & set "%~1=%END%" & set "%~2=%PRE:~2%" 
exit /B