2016-04-02 8 views
2

CSVファイルの列を変数にロードしようとしています。バッチファイルトークンで空の区切り文字が無視される

tony 
steve 

だから、
FOR /F "tokens=3 delims=," %%a in (csvfile.csv) do (
    set date=%%a 
    echo %%a 
) 

ファイルcsvfile.csv

fred,wilma,tony, john, greg, wilber, blake 
chris,,steve,deon,bryan,mark,anthony 

が含まれている場合、私は結果を希望:私のCSVファイルには、空の列がとても以下で無視されるように思われる,,を持つことができます含まれています

しかし、私は得る:

tony 
deon 

空の列に空白を入れると、期待どおりに機能します。

delimsを空の列を無視しないように設定するにはどうすればよいですか?

答えて

3

forは、連続区切り文字を1として扱います。ほとんどの場合、これは役に立ちます。時々そうではありません。

あなたはあなたの意図通りにforが処理できるように、行を書く必要があります。

読む全体として、あなたのファイルのすべての行、最初と最後に引用符を追加し、これは喜んで別のforで解析することができ

"chris","","steve","deon","bryan","mark","anthony" 

で、その結果、","ですべての,を交換してください。 %%~bのティルダは、周囲の引用符を削除します。

@echo off 
setlocal enabledelayedexpansion 
FOR /F "tokens=*" %%a in (csvfile.csv) do (
    set line="%%a" 
    for /f "tokens=3 delims=," %%b in ("!line:,="^,"!") do echo %%~b 
) 
+0

'(" "!line:^、^ ="、 "!" ")'のように外側の '' "'を置く必要はありません。 'コマンド? – aschipfl

+0

@aschipflはうまくいきました(少なくともトークン<> 1の場合)。また、あなたの提案はうまくいきません。私の編集したコードを見てください。 – Stephan

+0

それは私のために働いた、私はそれを正常にテストした;変更されたエスケープに注意してください。とにかく、 '〜'は先頭の '' 'に依存しているようですが、末尾の' 'には依存しません;ちなみに' 'echo-%%〜b''の' - 'はタイプミスですよね? – aschipfl

0
@ECHO OFF 
SETLOCAL ENABLEDELAYEDEXPANSION 
SET "sourcedir=U:\sourcedir" 
SET "filename1=%sourcedir%\q36372429.txt" 
SET "oneline=" 

FOR /f "usebackqdelims=" %%a IN ("%filename1%") DO (
SET "line=%%a" 
FOR /f "tokens=3delims=," %%h IN (" !line:,= , ! ") DO (
    SET "column=%%h" 
    SET "oneline=!oneline! !column:~1,-1!" 
    ECHO(!column:~1,-1! 
) 
) 
ECHO %oneline:~1% 

GOTO :EOF 

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

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

残念ながら、現実的なデータサンプルは表示されていません。私は宛先変数としてdateを使用していることに非常に疑念があります。

dateは、システムによって現在の日付として管理されている「魔法の変数」です。オーバーライドすることはできますが、そうすることはお勧めできません。

あなたがこの手順から欲しいものは本当に明確ではありません。おそらく、列3のすべての項目を、行線上に表示したい場合や、列3のみを表示したい場合や、出力を新しいファイルに転送したい場合があります。

関連する問題