2017-04-13 89 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