ウォッチ漫画『酒男子』新連載開始!

 例えば、以下のような二行からなるCSVファイルが有ります。
TK,001,A,DC, ,5,12
TK,002,B,DC,13,6,13
 
バッチで、このファイルを読み込んで、以下のようなレイアウトでCSVファイルを出力したいです。
TK,A, ,12
TK,B,13,13

 しかし、一行目のデータに空の項目が発生していますので、
for /f "delims=, tokens=1-7" %%I in (sample.csv) do (

)
 で処理した場合、自動に、空の項目を飛ばし、次の項目を読み込みますので、出力ファイルは以下のようになってしまいます:
TK,A,5 ,12
TK,B,13,13
 
 こういうことを避けたいですが、なかなかいい方法が見つかりません。解決方法をご存知の方、教えていただけませんか?

A 回答 (1件)

お書きのように、カンマの間に空白がある場合は、ちゃんと空白が読み取られますよ。


空白が無く、カンマが連続しているときは、連続した全体を1つの区切り文字と認識しますけど。

もし、空白が無く連続したカンマを別々のカンマと認識したいなら、まず連続したカンマを、,@, のように間にデータ中に現れ得ない別の文字を入れた物に置換してから読み取って、出力の時に @ をまた空に戻すような方針で。
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qバッチファイル 文字列にスペースがある場合

for /f %%A in ('dir /b /s c:\a aa*.pdf') do copy "%%A" D:\

これはcドライブのa aaというフォルダ名の中を検索するコードですが、
フォルダ名にスペースがあるため、うまく動きません。

"a aa"のように""で囲ってみましたが、駄目でした。

どうすれば良いのか、教えていただきたいので、お願いします。

Aベストアンサー

for /f %%A in ('dir /b /s c:\"a aa"\*.pdf') do echo copy "%%A" D:\
のようにecho でどのようなコマンドが実行されているか確認しましょう。

この記述ではdirコマンドで表示されるパスの中に空白があるため %%A には空白までの文字列しか代入されません。
以下のように修正して試してみてください。

for /f "delims=" %%A in ('dir /b /s c:\"a aa"\*.pdf') do copy "%%A" D:\

Qバッチでcsvファイルの指定のカラムを編集したい

バッチでファイルの編集をしたい

バッチファイルを使用して、csvファイルの読み込み~編集を行いたいと思っております

元ファイル:TEST_DATA.csv
内容:
111,222,333,444,555
123,456,789,321,987


上記のcsvファイルを読み込み、
・5カラム目が987ならば3カラム目を654に変更する
という処理を実行させたいのですが、
どのように行えばよいのでしょうか?

現在考えていることは、
1.for文を使用して指定のカラムを抜く(3カラム目と5カラム目を抜く))
2.5カラム目の値をif条件に指定し、合致した場合、抜いた3カラム目の変数に654を入れる
3.654に変更した変数を3カラム目の値として入れる

という順番で行えばいいと思っているのですが、
下記まで行ったところで行き詰ってしまいました

for /F "tokens=3,5 delims=," %%i IN (TEST_DATA.csv) DO @(if %%j==987 set %%i=654 echo %i %j )



お分かりになられる方、ご教授願えませんでしょうか

バッチでファイルの編集をしたい

バッチファイルを使用して、csvファイルの読み込み~編集を行いたいと思っております

元ファイル:TEST_DATA.csv
内容:
111,222,333,444,555
123,456,789,321,987


上記のcsvファイルを読み込み、
・5カラム目が987ならば3カラム目を654に変更する
という処理を実行させたいのですが、
どのように行えばよいのでしょうか?

現在考えていることは、
1.for文を使用して指定のカラムを抜く(3カラム目と5カラム目を抜く))
2.5カラム目の値をif条件に指定し、合致した場合、抜...続きを読む

Aベストアンサー

5カラムまであるとして、

for /f "tokens=1-5 delims=," %%A in (TEST_DATA.csv) do (
if %%E == 987 (echo %%A,%%B,654,%%D,%%E) else (echo %%A,%%B,%%C,%%D,%%E)
)

もっと他の条件があれば、さらに複雑な処理になります。

Qbatである文字列内に特定の文字列が含まれているか確認したい

batファイルの中である変数「abc」の中に「test」という文字が含まれていたら○○を行なうという分岐を作成したいのですが、どのように行なえばよいのでしょうか?

そのまま、ずばりのお答えお待ちしております。

よろしくお願い致します。

Aベストアンサー

大文字小文字を区別しなくていいなら、

if not "%abc:test=%" == "%abc%" echo 含まれていた

区別するなら、

echo %abc% | find "test" >NUL
if not ERRORLEVEL 1 echo 含まれていた

Qバッチでテキストファイルから任意の行のみ取得したい

batファイルを作成していて、
txtから特定の行のみをとりだし、変数に入れたいです。
どうもよくわからないので質問したいと思います。
まず以下の様なテキストファイルがあります。
-------------------
111
222
333
-------------------
実際の値、行数は違いますが、こんな感じに文字列が複数行並んでいます。

行いたい動作は、
-----------------------------------------
1.テキストファイルの1行目を変数Textに入れる(set Text=111)
2.変数Textを使用し色々処理をする
3.テキストファイルの2行目を変数Textに入れる(set Text=222)
4.変数Textを使用し色々処理をする
-----------------------------------------
コレを繰り返します。
2と4は同じ動作ですので、行数のカウンタを設定しループさせる予定です。
n行目を全て取り出す方法がわかれば行けると思うのですが、
どうも見つかりません。ご存知の方がいればお教え願いたいと思います。

batファイルを作成していて、
txtから特定の行のみをとりだし、変数に入れたいです。
どうもよくわからないので質問したいと思います。
まず以下の様なテキストファイルがあります。
-------------------
111
222
333
-------------------
実際の値、行数は違いますが、こんな感じに文字列が複数行並んでいます。

行いたい動作は、
-----------------------------------------
1.テキストファイルの1行目を変数Textに入れる(set Text=111)
2.変数Textを使用し色々処理をする
3.テキストファイルの2行目を変数T...続きを読む

Aベストアンサー

No3ですが、たぶん提示したスクリプトを見ると、ある事に気がつくはず?

findstr /n /r "." a.txt | findstr /r "^3:"

で3行目を表示してくれます。え!? それだけ。そうなんです

ただ、あと、先頭の”3:” をどうやって切り離すか? と言う問題にぶつかる。さらにファイルに先頭に”3:”があった場合、どうするのか? さらに、findstr の正規表現の動作が??? 表示すれるのはいいが、変数にどうやってセットするのか?

となる。結局 for 文を使いまわす事になります。

まあ、適当に改変して、上記の問題を解決してください。

Qバッチ処理でファイルの中身を変数に入れるやり方

あるファイルの中には1行の文字列があります。
このファイルをバッチで読み取り、変数に設定したいです。

例:
test.txt
abcacbacbacbacbacbacbacbacb

test,bat
set DATA=[test.txtを読み込んだ値]

よろしくお願い致します。

Aベストアンサー

これですね。

参考URL:http://www.upken.jp/kb/dqvgHNRUxwFDkmtoqEwfXHUjDrevNv.html

Q「,」区切りのcsvファイルを検索して文字列抽出したい

環境:windows2000
csvファイル形式:
pat,\path1\path2,\path\path3
pat_a,\path4\path5,\path7\path8
pat_a,\path7\path6,\path8\path9
バッチファイルに引数%A%を渡してcsvファイルを検索します。
検索文字列は引数%A%です。一行目に検索しようとする文字列があると
それを%%Jにset してあげます。最後に渡された引数とセットされた文字列が同じであればOKです。
自分で考えたのですがなかなかうまくいきません。
みなさまのご教授おねがいします。
FOR /F "tokens=1 delims=," %%l in ('findstr /R "%1" rrr.csv') do set palam=%%l
echo "渡された引数 [%1] "
echo "セットされた文字列 [%palam%] "
if "%palam%" NEQ "%1" (
goto :erro_end
)
引数は「pat」を渡したのですがセットされた文字列が「pat_a」
になってしまうんです。

環境:windows2000
csvファイル形式:
pat,\path1\path2,\path\path3
pat_a,\path4\path5,\path7\path8
pat_a,\path7\path6,\path8\path9
バッチファイルに引数%A%を渡してcsvファイルを検索します。
検索文字列は引数%A%です。一行目に検索しようとする文字列があると
それを%%Jにset してあげます。最後に渡された引数とセットされた文字列が同じであればOKです。
自分で考えたのですがなかなかうまくいきません。
みなさまのご教授おねがいします。
FOR /F "tokens=1 delims=," %%l in ('findstr /...続きを読む

Aベストアンサー

カンマをつけてうまくいく理由は、

FOR /F "tokens=1 delims=," %%l in ('findstr /R "^%1," rrr.csv') do set palam=%%l

が処理されるとき、まず
findstr /R "^%1," rrr.csv
の部分が処理されるからです。この時点ではまだカンマでは区切られず、

pat,\path1\path2,\path\path3
pat_a,\path4\path5,\path7\path8
pat_a,\path7\path6,\path8\path9

が findstr にそのまま渡されます。したがって、pat だけで検索すると、pat も pat_a も該当してしまいます。

しかしCSVファイルなので、最初の項目の次には必ずカンマが来ることを利用して、 pat, で検索すると、1行目だけが該当します。

この結果が FOR 文の中で展開され、

FOR /F "tokens=1 delims=," %%l in ("pat,\path1\path2,\path\path3") do set palam=%%l

のようになり、ここではじめて delims=, が効いてカンマで区切られ、palam に pat が代入されます。

カンマをつけてうまくいく理由は、

FOR /F "tokens=1 delims=," %%l in ('findstr /R "^%1," rrr.csv') do set palam=%%l

が処理されるとき、まず
findstr /R "^%1," rrr.csv
の部分が処理されるからです。この時点ではまだカンマでは区切られず、

pat,\path1\path2,\path\path3
pat_a,\path4\path5,\path7\path8
pat_a,\path7\path6,\path8\path9

が findstr にそのまま渡されます。したがって、pat だけで検索すると、pat も pat_a も該当してしまいます。

しかしCSVファイルなので、最初の...続きを読む

QWindowsバッチのCSV読み込みについて

WindowsバッチにてCSVファイルのデーターの読み込みを行いたいと考えています。

CSVの中身(test.csv)-------------------------------------
"CN=test1,CN=users,DC=testdomain,DC=local","test1","aaa"
"CN=test2,CN=users,DC=testdomain,DC=local","test2","bbb"

上記の取り込み方として、以下のバッチを実行しようとした場合、求めている結果になりません。

for /f "delims=, usebackq tokens=1-3 usebackq" %%i in ("test.csv") do echo %%i, %%k

○求める結果
"CN=test1,CN=users,DC=testdomain,DC=local","aaa"
"CN=test2,CN=users,DC=testdomain,DC=local","bbb"

○得られた結果
"CN=test1,CN=users,DC=testdomain
"CN=test2,CN=users,DC=testdomain

""(ダブルコーテーション)で括ったものを、ひとつのカラムとして受け渡したすことはできないでしょうか。よろしくお願い致します。

WindowsバッチにてCSVファイルのデーターの読み込みを行いたいと考えています。

CSVの中身(test.csv)-------------------------------------
"CN=test1,CN=users,DC=testdomain,DC=local","test1","aaa"
"CN=test2,CN=users,DC=testdomain,DC=local","test2","bbb"

上記の取り込み方として、以下のバッチを実行しようとした場合、求めている結果になりません。

for /f "delims=, usebackq tokens=1-3 usebackq" %%i in ("test.csv") do echo %%i, %%k

○求める結果
"CN=test1,CN=users,DC=testdomain,DC=local"...続きを読む

Aベストアンサー

>""(ダブルコーテーション)で括ったものを、ひとつのカラムとして受け渡したすことはできないでしょうか。

出来ないと思います。
出来るように作られていないようです。

問題を解決するには、CSV形式か、Windowsバッチのみを諦めればいい訳ですが...

QバッチファイルのFOR文について【tokens~】

お世話になっております
バッチファイルの、文字列操作で
----------------------------------------------------------
FOR /F "eol=; tokens=2,32 delims=, " %i in (myfile.csv) do @echo %i %j %k
----------------------------------------------------------
のtokensで指定している32列目(カンマが32個目)以降の値を
取得しません。
なぜでしょうか。

下記のHPを参照すると、一度変数をクリアしそのしたでさらにForで
指定すればよいとのことなのですが、欲しい値が多すぎて
とても、Forのしたに何度書きたくありません。
http://folomy.jp/heart/?m=pc&a=page_c_topic_detail&target_c_commu_topic_id=12560
どのようにしたら、目的を果たせるのでしょうか。
ご教授ください。

お世話になっております
バッチファイルの、文字列操作で
----------------------------------------------------------
FOR /F "eol=; tokens=2,32 delims=, " %i in (myfile.csv) do @echo %i %j %k
----------------------------------------------------------
のtokensで指定している32列目(カンマが32個目)以降の値を
取得しません。
なぜでしょうか。

下記のHPを参照すると、一度変数をクリアしそのしたでさらにForで
指定すればよいとのことなのですが、欲しい値が多すぎて
とても、Forのした...続きを読む

Aベストアンサー

#1です。
リンク先を見落としていました。今試してみしたら確かに32以降は指定しても取得できないようです。仕様ですかね。
具体的にどれくらいの列を指示したいのでしょうか。
リンク先のような方法か、call文の引数で渡してサブルーチンで分解するくらいしか方法が思いつきません。スミマセン。

Qechoの出力の最後のスペースを除去したい

テキストファイルにechoで出力するバッチファイルを作成しています。

echo出力の最後にスペースが1つだけ余分に追加されてしまいます。
これを除去するにはどうしたらよいでしょうか。

例えば、以下の内容が記載されたバッチファイルを実行すると、
出力の最後に不要な半角スペースが追加されます。

   set COMMAND=ping 192.168.0.1 -n 1
   echo %COMMAND% >> out.txt

Aベストアンサー

実際に試すと #1 の方法は都合が悪いことがわかる. 方針はあってるんだけどね.

リダイレクトって, 行の最後じゃなくてもいいんだよ.

QDOSのバッチで、テキストファイル中の文字を置換したい

いつもお世話になっております。

WindwsXPでDOSバッチを使ってテキストファイル中にある文字列1を文字列2に置換したいのです。
ネットをさまよっていて、こんな例を見つけました。
(参考にしたのはここです。http://www.fpcu.jp/dosvcmd/bbs/log/cat3/cat54/2-0391.html)

======================
@echo off
if "%1"=="" goto end
set fname=%1
copy %fname% org >nul
type nul >%fname%
for /f "tokens=1* delims=" %%a in ( org ) do (set line=%%a&& call :sub)

del org
goto end

:sub
:この1行下の acb=xyz に置換前と置換後の文字列を指定する。
set l=%line:abc=xyz%
echo %l%>>%fname%
goto :EOF

:end
======================

これをsample.batという名前で保存し、DOSのウィンドウでsample < a.txt と打つと、a.txtファイル中の"abc"が"xyz"に置き換わります。

これに手を入れて置換前と置換後の文字列を可変にしたく思い、sub中に

set mae=abc
set ato=xyz

の2行を加え、変数に値を設定するようにしました。

ところが、次の1行の書き変え方がわかりません。

set l=%line:abc=xyz%



set l=%line:%abc%=%xyz%%

のように変えてみましたが、うまく動きません。

どなたかご教授いただけませんか。DOSだけでファイル中の文字列の置換ができればset文を使う使わないにはこだわりません。

いつもお世話になっております。

WindwsXPでDOSバッチを使ってテキストファイル中にある文字列1を文字列2に置換したいのです。
ネットをさまよっていて、こんな例を見つけました。
(参考にしたのはここです。http://www.fpcu.jp/dosvcmd/bbs/log/cat3/cat54/2-0391.html)

======================
@echo off
if "%1"=="" goto end
set fname=%1
copy %fname% org >nul
type nul >%fname%
for /f "tokens=1* delims=" %%a in ( org ) do (set line=%%a&& call :sub)

del org
goto end

:sub
...続きを読む

Aベストアンサー

No.5 です。

>勝手に引用してしまってすみません。
皆さんに参考にしてもらうために回答しているので気になさらずに引用してください。

さてご質問の件ですが、

◆予備知識
まず、環境変数を%で囲むと、バッチがその行を実行するときに環境変数の中身に置き換えられることを理解してください。
例)
set mae=abc
set ato=xyz

echo %mae% %ato% ←※

※の行が実行されるとき、実際は
echo abc xyz
と置き換えられてecho文が実行されます。

また、バッチ内では %% と%が2つ並んだ記述は1つの%に置き換えられます。

例)echo 10割は100%%
10割は100%


◆今回の場合

call set l=%%line:%mae%=%ato%%%
↓実行されるときに以下のように置き換えられます。
call set l=%line:abc=xyz%

置き換え後に call 文が実行されます。このcall文の記述だと set l=%line:abc=xyz% という1行のバッチを呼び出しているのと同等の動作になります。従って環境変数lineに入っている文字列のabcがxyzに置き換えられた結果が環境変数lに代入されます。
call文でワンクッション置いて、先に環境変数の mae と ato (と%%)だけ評価(環境変数の中身に置き換え)するようにしています。

◆単純に set l=%line:%mae%=%ato%% とした場合なぜうまくいかないか

set文の右辺の各要素を分けて書くと

%line:%(line: という環境変数の中身)→そんな変数は定義していないので空に置き換え

mae

%=%(= という環境変数の中身)→そんな変数は定義できないので空に置き換え

ato

%% → % に置き換え

と解釈されて
環境変数lには maeato% という文字列が代入されてしまいます。


余談ですがバッチ実行時にどのように置き換えられるか見たい場合は、
バッチ先頭のecho offの行を取って実行するとよく分かります。

No.5 です。

>勝手に引用してしまってすみません。
皆さんに参考にしてもらうために回答しているので気になさらずに引用してください。

さてご質問の件ですが、

◆予備知識
まず、環境変数を%で囲むと、バッチがその行を実行するときに環境変数の中身に置き換えられることを理解してください。
例)
set mae=abc
set ato=xyz

echo %mae% %ato% ←※

※の行が実行されるとき、実際は
echo abc xyz
と置き換えられてecho文が実行されます。

また、バッチ内では %% と%が2つ並んだ記述は1つ...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング