2017-04-13 6 views
0

ich eine große Textdatei habe, die wie folgt aussehen:Ersetzen letzte Zeichen nach dem letzten Komma mit einem String

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 

Die gewünschte Ausgabe ist dies:

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 

Ich habe versucht, andere relevante hier Beiträge und auf anderen Communities aber konnte nicht genau bekommen was ich will.

UPDATE

Dies ist cross-question (Ich wollte beide Unix/Perl Antworten und Batch/Powershell Lösungen für diese.), Die interessante Antworten hat.

+0

Sie haben alle Linien immer 8 -comma getrennte Elemente? – dcg

+0

Ja! 8 Elemente. – Masoud

Antwort

2

Hier ist eine Powershell-Antwort, falls Sie PS mögen.

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

Der nächste Code tut, was Sie wollen, außer zum Füllen mit Null das letzte Token, wenn weniger als 10 ist, hoffe es hilft.

BEARBEITEN: Ich habe einen Weg gefunden, eine führende Null einzufügen, wenn die letzte Zahl kleiner als 10 ist. Ein bisschen hässlich, aber tut es. :)

@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ür Datei (f.txt in diesem Fall):

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 

erzeugt das folgende Ergebnis (auch in f.txt): aktualisiert

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

Diese ist die Antwort, die @RomanPerekhrest bei meiner Quer-Frage zur Verfügung gestellt (Suche nach Unix/Perl-Lösungen) here:

awk Ansatz mit sprintf-Funktion (zu führenden Nullen hinzugefügt werden):

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

Der Ausgang:

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

Bitte tun ** nicht ** [Cross-Post] (https://meta.stackexchange.com/q/64068)! – aschipfl

+0

@aschipll Ich wollte Antworten für Unix/Perl und Powershell/Batch-Lösungen, da meine Kollegen die gleichen Dateien bearbeiten und Cygwin auf ihrem Rechner installiert haben.Stimme jedoch voll und ganz mit Ihrer Sache überein. – Masoud

1

Hier ist eine cmd Batchdatei, die das letzte Element einer durch Kommata getrennte Liste, unabhängig von der Anzahl der Kommata treten in der Zeichenfolge abzuspalten auf einem schönen Hack beruht. Die grundlegende Technik wird im Folgenden gezeigt; beachten Sie, dass diese delayed expansion aktiviert sein muss:

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% 

So, hier ist der Code des Skripts, das Halten des oben genannten Verfahrens in einer Unterroutine namens :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 
Verwandte Themen