2014-01-10 3 views
0

많은 날짜 필드가있는 .tab < 탭으로 구분 된 파일>이 있습니다.일괄 스크립트를 사용하여 .tab 파일의 모든 날짜 필드 값 변경

내 요구 사항은 날짜 필드의 모든 값이 1 년씩 증가하도록 창에서 일괄 처리를 사용하여이 파일을 처리하는 것입니다. 일반 필드와 수정 된 날짜 필드가 포함 된 출력 파일 <을 저장하십시오.

날짜 필드의 순서가 올바르지 않으므로 형식을 사용하여 파일을 검색해야합니다. 다음과 같은 포맷이 사용되었다 : 예를 들면

11/11/2011 
4 years ago 
34 months ago 
547 days ago 

:

Id   date1    date2 
1  11/11/2011  3 years ago 
2  46 months ago  567 days ago 

출력 파일을 처리 한 후 위의

Id  date1    date2 
1  11/11/2012  2 years ago 
2  34 months ago  202 days ago 


The data above is formatted for the sake of understanding.. the actual tab delimited file looks like: 

이드 DATE1 DATE2 같아야 1 11/11/2011 3 년 전 2 46 개월 전 567 일 전

업데이트 : 불행히도 위의 내용은 여기에 붙여 넣을 때 이상하게 보입니다 (줄 바꿈없이). 여기에 파일을 첨부하는 옵션은 무엇입니까 ?? 아이디어를주는 Magoo에

확인 .. 감사합니다 .. 여기에 파일 그러나

https://drive.google.com/file/d/0B9XC4xcTUoq1OEZsODZFaTl6aDQ/edit?usp=sharing

를 포함하는 구동 링크는, 샘플 파일은 다음과 같이 작성되었습니다 :

Iddate1date2111/11/2011 년 전 246 일 전 < 567 일 전>

인터넷에서 찾았지만 행운은 없습니다. 여기 쓰기, 누군가가 나를 도울 수 있다고 기대.

UPDATE :

Magoo의 솔루션 작동하지만

주목할만한 정확한 O/P를받지하면 입력도 (내가 제대로 때문에 서식 문제의 여기에 붙여 넣을 수) 탭 DELIM 오입니다/P 탭 딜림으로 와야합니다.

다음은 코드와 관련한 내용입니다. 또한

Id date1 date2  
1 11/11/2012 1 11/11/2013 1 11/11/2014 
2 days ago 

, 이것은 샘플 파일, 실제 파일은 50 일의 혼합물이 아닌 날짜 열 (열 위치가 고정)를 포함, 그래서 우리는 동적 (확실하지하지만 우리가 할 수 할 수 있다면 그것은 좋은 것입니다 위의 형식을 검색 할 수 있습니다.) 날짜 필드를 찾고 날짜 값을 변경하십시오.

+0

문제의 파일 중 일부를 게시하면 명확 해집니다. 예를 들어 파일 **이 실제로 어떤 모습인지 ** 표시해야하기 때문에 파일에 실제로 "3 년 전"이 포함되어 있는지 확실하지 않습니다. – foxidrive

+0

안녕하세요,이 파일은 실제로 "x 년 전"날짜 형식을 정의하는 다른 형식을 가지고있는 것처럼 보입니다. – user2407394

+0

입력 형식을 분명히해야합니다. 데이터를 탭으로 구분 된 것으로 설명하지만 게시 한 데이터에는 탭이 없습니다. 파일이 실제로 고정 열입니까? 헤더가 오프셋되어 있습니까 (입력시 col> 1, 출력시 2, 출력 2 인 경우 2 문자 씩)? 당신이 게시 한 공간 순서를 당신이 설명한 것처럼 TABS로 바꿨습니다. 필드가 실제로 고정 된 열이면 작은 변경이 필요합니다. 입력 파일이 고정 열이고 사용자가 설명하는 탭을 포함하지 않는 경우 정확히 동일한 출력을 얻습니다. 누락 된 운영자를보고하지 않습니다. 메시지. – Magoo

답변

1
@ECHO OFF 
SETLOCAL 
:: The character between the = and closing quote in the next line is a TAB 
SET "tab= " 
(
FOR /f "tokens=1-3delims=%tab%" %%a IN (q21051778.txt) DO (
    SET "line=" 
    SET "column=%%a"&CALL :process 
    SET "column=%%b"&CALL :process 
    SET "column=%%c"&CALL :process Y 
) 
)>newfile.txt 

GOTO :EOF 

:process 
FOR %%A IN (Field1 Field2 Field3) DO SET "%%R=" 
:: Format 1 : num/num/num - possibly with leading 0s 
FOR /f "tokens=1,2*delims=/" %%A IN ("%column%") DO (
SET field1=%%A 
SET field2=%%B 
SET field3=%%C 
) 
IF DEFINED field3 CALL :plaindate 
SET "endtext= years ago" 
CALL :adjust 10 1 
SET "endtext= months ago" 
CALL :adjust 11 12 
SET "endtext= days ago" 
CALL :adjust 9 365 
IF "%1"=="Y" (ECHO %line%%tab%%column% 
) ELSE (
IF DEFINED line (SET "line=%line%%tab%%column%") else (set "line=%column%") 
) 
GOTO :eof 

GOTO :eof 

:: If the last %1 characters of column are %endtext% and the remainder is numeric, 
:: subtract %2 from the numeric part 
:adjust 
CALL SET "endpart=%%column:~-%1%%" 
IF /i NOT "%endpart%"=="%endtext%" GOTO :EOF 
CALL SET "endpart=%%column:~0,-%1%%" 
CALL :isnumeric %endpart% 
IF %numeric%==N GOTO :eof 
SET /a endpart=%endpart%-%2 
CALL SET "column=%endpart%%%column:~-%1%%" 
GOTO :eof 

:plaindate 
CALL :isnumeric %field1% 
IF %numeric%==N GOTO :eof 
CALL :isnumeric %field2% 
IF %numeric%==N GOTO :eof 
CALL :isnumeric %field3% 
IF %numeric%==N GOTO :eof 
SET /a field3+=1 
:: Reconstruct with modified contents 
SET column=%field1%/%field2%/%field3% 
GOTO :eof 

:: Check whether %1 is purely numeric. 
:: set 'numeric'=Y or N 
:isnumeric 
:: Include a leading "9" which will be removed IN the final FOR iteration 
SET "numeric=9%1" 
SETLOCAL ENABLEDELAYEDEXPANSION 
FOR /l %%n IN (0,1,9) DO SET numeric=!numeric:%%n=! 
endlocal&SET "numeric=%numeric%" 
IF DEFINED numeric (SET numeric=N) ELSE (SET numeric=Y) 
GOTO :eof 

을 처리합니다.

파일을 현재 위치에서 업데이트 할 수 없습니다.새 파일을 만들어야합니다. 원본 파일은 q21051778.txt이고 새 파일은 newfile.txt입니다. 당신은 자신에게 맞게 변경해야 할 것입니다.

당신은

move /y newfile.txt q21051778.txt 

을 실행하여 원본 파일을 대체 할 수 있지만, 당신은 단지 테스트 및 검증 한 후이 작업을 수행해야합니다.

더 많은 열이 필요한 경우 tokens=1-33을 최대 #으로 변경하고 SET "column=..."&CALL :process 개의 줄을 추가하여 문자를 증가시켜 선택한 열을 변경하는 것입니다. 만 맨 마지막 call :processY 매개 변수 (이 출력의 라인을 트리거 것입니다) 새 매개 변수 주어진


개정 있습니다. 이 버전은 열 제한에 영향을받지 않지만 설명 된대로 tab 자의 존재에 크게 의존합니다.

@ECHO OFF 
SETLOCAL 
:: The character between the = and closing quote in the next line is a TAB 
SET "tab= " 
(
FOR /f "delims=" %%a IN (q21051778.txt) DO (
    SET "line=" 
    SET "lineread=%%a" 
    CALL :process 
) 
)>newfile.txt 

GOTO :EOF 

:process 
FOR /f "tokens=1*delims=%tab%" %%b IN ("%lineread%") DO (SET "column=%%b"&SET "lineread=%%c") 
FOR %%A IN (Field1 Field2 Field3) DO SET "%%R=" 
:: Format 1 : num/num/num - possibly with leading 0s 
FOR /f "tokens=1,2*delims=/" %%A IN ("%column%") DO (
SET field1=%%A 
SET field2=%%B 
SET field3=%%C 
) 
IF DEFINED field3 CALL :plaindate 
SET "endtext= years ago" 
CALL :adjust 10 1 
SET "endtext= months ago" 
CALL :adjust 11 12 
SET "endtext= days ago" 
CALL :adjust 9 365 
IF DEFINED line (SET "line=%line%%tab%%column%") else (set "line=%column%") 
IF DEFINED lineread GOTO process 
ECHO %line% 
GOTO :eof 

:: If the last %1 characters of column are %endtext% and the remainder is numeric, 
:: subtract %2 from the numeric part 
:adjust 
CALL SET "endpart=%%column:~-%1%%" 
IF /i NOT "%endpart%"=="%endtext%" GOTO :EOF 
CALL SET "endpart=%%column:~0,-%1%%" 
CALL :isnumeric %endpart% 
IF %numeric%==N GOTO :eof 
SET /a endpart=%endpart%-%2 
CALL SET "column=%endpart%%%column:~-%1%%" 
GOTO :eof 

:plaindate 
CALL :isnumeric %field1% 
IF %numeric%==N GOTO :eof 
CALL :isnumeric %field2% 
IF %numeric%==N GOTO :eof 
CALL :isnumeric %field3% 
IF %numeric%==N GOTO :eof 
SET /a field3+=1 
:: Reconstruct with modified contents 
SET column=%field1%/%field2%/%field3% 
GOTO :eof 

:: Check whether %1 is purely numeric. 
:: set 'numeric'=Y or N 
:isnumeric 
:: Include a leading "9" which will be removed IN the final FOR iteration 
SET "numeric=9%1" 
SETLOCAL ENABLEDELAYEDEXPANSION 
FOR /l %%n IN (0,1,9) DO SET numeric=!numeric:%%n=! 
endlocal&SET "numeric=%numeric%" 
IF DEFINED numeric (SET numeric=N) ELSE (SET numeric=Y) 
GOTO :eof 
+0

그 좋은 좋은 문제는 내가 원하는 O/P .. (+1 좋은 코드를 얻지 못하고있다 ..) 질문에 업데이 트를 참조하십시오 .. 내가 원하는 코드를 수정하려고합니다. 얼마나 성공할지 확신 할 수 없습니다. – user2407394

2

아래의 배치 파일은 파일의 데이터 위치가 고정되어 있다고 가정하므로 적절한 열에서 몇 년이 걸립니다. 날짜 위치가 바뀔 수 있다면 더 복잡한 해결책이 필요합니다. 당신이 요청으로

@echo off 
setlocal EnableDelayedExpansion 

set "line=" 
for /F "delims=" %%a in (input.txt) do (
    if not defined line (
     set "line=%%a" 
     echo !line! 
    ) else (
     set "line=%%a" 
     set /A y1=!line:~15,2!+1, y2=!line:~28,2!+1 
     echo !line:~0,15!!y1!!line:~17,11!!y2! 
    ) 
) 
+0

nice를 참조하십시오. 하지만 나는 "많은 날짜 필드를 가지고"두려워 해요 date3, date4, date5, ... – Stephan

+0

위대한 거기에 여러 날짜 필드가 있습니다 .. 파일은 <.tab> 확장입니다. 우리는 그것을 사용할 수 있습니까 ?? 또한 .. 동적으로 형식을 찾고 날짜 필드를 찾을 수있는 방법은 무엇입니까 ?? – user2407394

+0

또한 스크립트는 입력 파일을 수정해야합니다 .. !! – user2407394