2016-03-25 2 views
0

私はCSVファイルに問題があり、バッチが役立つと感じています。 私のCSVファイルには6つの値(%a-%f)があります。 他の問題の中には、最初の値である文字列に基づいてCSVファイルの切り取りと貼り付け(洞窟スタイル)で手動でデータを作成しなければならないという事実があります。 他の値は整数ですので、うまくいけば私の仕事が簡単になります。バッチプログラムはこれをCSVに対して行うことができますか?

00-text-00-000 

フォーマット:ここで

は、私はそれが整数とハイフン

例が含まれている、よう

私の%は、文字列が醜いとカウンターで手動でオフに基づいて%をデータの作成を意味するものです私の%aに必要な文字列の数は、このようになります。

ww-xx-yy-zzz 

ここで、ww、yy zzzは整数のようなカウンターです。 xxはランダムなテキストです。

これは私の問題のセットアップです。ここは私の主な目標です。

CSVファイルの%aのyy部分が01,02または03の場合、これらの行全体の値がコピーされ、新しいデータとしてCSVファイルに追加される必要があります。ここでは実際のキッカーです。

00-text-00-000 
00-text-00-001 
00-text-01-000 
00-text-01-001 
00-text-02-000 
00-text-02-001 
00-text-03-000 
00-text-03-001 
00-text-04-000 
00-text1-00-000 
00-text1-00-001 
00-text1-01-000 
... 

その後、それは新しいデータを持っている:私のCSVファイルには、このような欠落データで始まること

01 needs to be 07 
02 needs to be 06 
03 needs to be 05 

ので、そのない正確なコピーように、YYの 値は、新しいデータのために今すぐ変更する必要があります%のために:

00-text-00-000 
00-text-00-001 
00-text-01-000 
00-text-01-001 
00-text-02-000 
00-text-02-001 
00-text-03-000 
00-text-03-001 
00-text-04-000 
00-text-04-001 
00-text-05-000 
00-text-05-001 
00-text-06-000 
00-text-06-001 
00-text-07-000 
00-text-07-001 

新しい行がそうでない場合、私は以前に述べたように、すべての01 07,02 06にして03 06に変更%以外で同じになります。

しかし、それだけではなく、%bの値も変更する必要があります。同じ数字であるが、その符号が反転している。だから、負である任意の%bは正になり、逆もまた同様です。 だから完全に私のデータは次のように起動します:

00-text-00-000,1,2,3,4,5 
00-text-00-001,-1,2,3,4,5 
00-text-01-000,-2,-1,2,1 
00-text-01-001,3,1,3,1 
00-text-02-000,4,4,4,4 
00-text-02-001,-4,-4,4,4 
00-text-03-000,-5,-6,5,5 
00-text-03-001,6,6,6,6 
00-text-04-000,-6,-6,6,6 
00-text-04-001,4,5,6,7 

をそして、このように終わる:

00-text-00-000,1,2,3,4,5 
00-text-00-001,-1,2,3,4,5 
00-text-01-000,-2,-1,2,1 
00-text-01-001,3,1,3,1 
00-text-02-000,4,4,4,4 
00-text-02-001,-4,-4,4,4 
00-text-03-000,-5,-6,5,5 
00-text-03-001,6,6,6,6 
00-text-04-000,-6,-6,6,6 
00-text-04-001,4,5,6,7 
00-text-05-000,5,-6,5,5 
00-text-05-001,-6,6,6,6 
00-text-06-000,-4,4,4,4 
00-text-06-001,4,-4,4,4 
00-text-07-000,2,-1,2,1 
00-text-07-001,-3,1,3,1 

はバッチでこれでも可能ですか?

答えて

3
@ECHO Off 
SETLOCAL ENABLEDELAYEDEXPANSION 
SET "sourcedir=U:\sourcedir" 
SET "destdir=U:\destdir" 
SET "filename1=%sourcedir%\q36214264.csv" 
SET "outfile=%destdir%\outfile.csv" 
(
FOR /f "usebackqtokens=1,2*delims=," %%a IN ("%filename1%") DO (
REM this reproduces the original line 
ECHO(%%a,%%b,%%c 
REM tokenise the first column 
SET "new1=" 
FOR /f "tokens=1-4 delims=-" %%p IN ("%%a") DO (
    IF %%r==01 SET "new1=%%p-%%q-07-%%s" 
    IF %%r==02 SET "new1=%%p-%%q-06-%%s" 
    IF %%r==03 SET "new1=%%p-%%q-05-%%s" 
) 
REM calculate -%%b 
SET /a new2=-%%b 
REM new output - only if column 1 was changed 
IF DEFINED new1 ECHO(!new1!,!new2!,%%c 
) 
)>"%outfile%" 

GOTO :EOF 

あなたの状況に合わせてsourcedirdestdirの設定を変更する必要があります。

テスト用にデータが入っているファイルq36214264.txtを使用しました。

処理がコメントで記述され%

OUTFILE%として定義ファイルを生成します。

delayedexpansionを使用すると、ループ内で変数の値にアクセスすることができます。サブルーチンを使用して行うこともできます。

このルーチンは、データを「生の」形式で出力します。ソートしたい場合はソートしてください。

1
@echo off 
setlocal EnableDelayedExpansion 

rem Define the corresponding indices in the new YY parts 
set "newYY[01]=07" 
set "newYY[02]=06" 
set "newYY[03]=05" 

set "lastXX=" 
rem Read an input line and separate it in the specified tokens 
(for /F "tokens=1-6 delims=," %%a in (input.csv) do (
    for /F "tokens=1-4 delims=-" %%w in ("%%a") do (

     rem If a new data set started 
     if "%%x" neq "!lastXX!" (
     rem If there is new data from previous set 
     if defined lastXX (
      rem Copy it 
      for /F "tokens=1,2 delims==" %%m in ('set newData[') do (
       echo %%n 
       set "%%m=" 
      ) 
     ) 
     rem Start the new set 
     set "lastXX=%%x" 
    ) 

     rem If this data must be duplicated 
     if defined newYY[%%y] (
     rem Duplicate it, as specified 
     set /A newB=-%%b 
     set "newData[!newYY[%%y]!-%%z]=%%w-%%x-!newYY[%%y]!-%%z,!newB!,%%c,%%d,%%e,%%f" 
    ) 

     rem Copy this data 
     echo %%a,%%b,%%c,%%d,%%e,%%f 

    ) 
)) > output.csv 

rem Copy the new data from last set 
(for /F "tokens=2 delims==" %%n in ('set newData[') do echo %%n) >> output.csv 
関連する問題