2016-12-04 20 views
0

私はこのバットファイルをどのように書く必要があるかを研究しています。何がうまくいかないのか分かりません。バットファイル:複数のファイルを解析してCSVに書き込む

問題/目標:私は5つのキー値を解析する必要がある巨大なtxtファイルがあります。各テキストファイルの最初の195行は、本質的に私が関心のないゴミです。

5つのテキストファイルがあり、それぞれ1つは5つのサブディレクトリにあります。 目標は、これらの5つのキー値(トークン7,11,19,21,25)をcsvファイルに書き込むことです。 (テキストファイルごとに5つのキー値がそれぞれ1800あります - 私が作成するcsvファイルの合計9000行を作成します)

最初のforループを入力すると「do (今のところ予期せぬことだった "

これは私の初めてのバットファイルに関数を書く、または1つ以上のループを必要とする。私は複数の場所で私の構文を微調整したが、同じエラーが発生する。何か不足していますが、わかりません。最初のループに入ることもできないので、私がまだ気づいていない追加のエラーもあります。

コード:

@ECHO OFF 
setlocal enabledelayedexpansion 
set fileout="C:\ffmpeg\fit.csv" 

for /R %%f in (*.txt) do (
set THEFILE=%%f 
call :setTokens 
goto TheEnd 
) 

:setTokens 
for /F "skip=195 tokens=* delims=" %%A in ('%THEFILE%') do(
    set the_line=%%A 
    call :process_line 
) 

:process_line 
for /F "tokens=7,11,19,21,25 delims= =:" %%a in ('%the_line%') do (
    set qp=%%a 
    set slice=%%b 
    set skip=%%c 
    set size=%%d 
    set y=%%e 
    set OUTLINE=%qp%,",",%slice%,",",%skip%,",",%size%,",",%y% 
    echo %OUTLINE%>>%fileout% 
) 

:TheEnd 
+0

'do(' - > 'do(' – aschipfl

+0

あなたが*ループ内の 'qp' etc *の値を変更しているので* (あなたが* delayedexpansion *を呼び出したように) '!qp!'を使って値を抽出すると、 '%qp%'は解析時に変数の値*を返します。これはあなたがaschipflの変更を呼び出したことを前提とし、 'qp'に割り当てた値を操作していないので、' metavariable''の '%% a'.. %% e' – Magoo

答えて

1

次のコードスニペットはあなたのために仕事をする必要があります。

@ECHO OFF 
SETLOCAL EnableExtensions DisableDelayedExpansion 

set fileout="C:\ffmpeg\fit.csv" 

>>"%fileout%" (
    for /R %%F in (*.txt) do (
    for /F "usebackq skip=195 delims=" %%A in ("%%~F") do (
     for /F "tokens=7,11,19,21,25 delims==: " %%a in ("%%~A") do (
     echo %%a,%%b,%%c,%%d,%%e 
    ) 
    ) 
) 
) 
:TheEnd 

完全を期すために、次のコードスニペットショーや修理を(以下のすべてのremのコメントを参照)スクリプトで目に余るミス(のほとんど) :

@ECHO OFF 
SETLOCAL EnableExtensions EnableDelayedExpansion 

set fileout="C:\ffmpeg\fit.csv" 

for /R %%f in (*.txt) do (
     rem strip ↓ incidental surroundig doble quotes (be on the safe side) 
    set "THEFILE=%%~f" 
    call :setTokens 
     rem `goto TheEnd` here would end the %%f loop just after the 1st iteration 
) 
    rem next goto moved from inside `for /R` body 
goto TheEnd 


:setTokens 
    rem ↓↓↓↓↓↓↓↓   ↓   quotes ↓   ↓ ↓ space 
for /F "usebackq skip=195  delims=" %%A in ("%THEFILE%") do (
    rem removed `tokens=*` ↑ as `delims=` suffices 
    set "the_line=%%~A" 
    call :process_line 
) 
    rem return from subroutine 
goto :eof 

:process_line 
    rem   order of delimiters ↓↓↓   ↓   ↓ quotes 
for /F "tokens=7,11,19,21,25 delims==: " %%a in ("%the_line%") do (
    set qp=%%a 
    set slice=%%b 
    set skip=%%c 
    set size=%%d 
    set y=%%e 
     rem note that all `,",",` denoted below are taken literally 
     rem   ↓↓↓↓↓  ↓↓↓↓↓  ↓↓↓↓↓  ↓↓↓↓↓ 
    set OUTLINE=%qp%,",",%slice%,",",%skip%,",",%size%,",",%y% 
    rem echo %OUTLINE%>>%fileout% 
    rem you need to apply delayed expansion as follows: 
    set OUTLINE=!qp!,!slice!,!skip!,!size!,!y! 
    echo !OUTLINE!>>%fileout% 
     rem  ↑↑↑↑↑↑↑↑↑↑↑ redirection could be moved 
     rem    ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ and lopp variables used directly 
    rem >>"%fileout%" echo %%a,%%b,%%c,%%d,%%e 
) 
    rem return from subroutine 
goto :eof 

:TheEnd 

リソース(必要な読み取り、不完全):

+0

ありがとう - これはうまくいった! さらに良い - リソースに感謝します。私はあなたが投稿した最初の参考文献から作業しています - 他の人は非常に感謝しています。 – user7248227

関連する問題