プロが教えるわが家の防犯対策術!

Windows10で、以下のバッチファイルを組みたいです。
----------------------------------------------------------------------------------------------
1.「normal-item.csv」というCSVファイルを1行目から読む。
2.3番目の項目「SKU管理番号」が空白なら、4番目の項目「在庫数」を空白にする。
  (4番目の項目は、必ず数値がセットされてます。)
----------------------------------------------------------------------------------------------

上記の処理をさせたく、以下のバッチファイルを組んでみましたが、全く動きません。
----------------------------------------------------------------------------------------------
@echo off

setlocal enabledelayedexpansion

for /f "tokens=3,4 delims=," %%a in (C:\DL汎用\WEB在庫データ\normal-item.csv) do (
set skuno=%%a
set zaiko=%%b

if "%skuno%" == "" (
set "%zaiko%"=""
)
)

endlocal

exit
----------------------------------------------------------------------------------------------
バッチファイルの基本を理解してないので、何が悪いのか全く分かりません。
有識者の方々にご助力いただければ幸甚です。
宜しくお願い致します。

質問者からの補足コメント

  • 頂いた内容をそっくりそのままコピーして、新たにバッチファイルを作成して試してみたのですが、normal-item.csvの中身とファイルの更新日時は変わっていませんでした。
    無の項目を判定するのは厳しいですかね。

    No.4の回答に寄せられた補足コメントです。 補足日時:2023/07/28 16:26

A 回答 (5件)

めんどうですが、一旦、,, を ,@, などに変換してからカンマで分割すると空文字列問題は起こらないので、そうするか。


@ は、データ中に出てこない文字。

@echo off
setlocal enabledelayedexpansion
(
for /f "delims=" %%X in (C:\DL汎用\WEB在庫データ\normal-item.csv) do (
 set "X=%%X"
 set "X=!X:,,=,@,!"  ←これでカンマの連続を ,@, に
 set "X=!X:,,=,@,!"  ←三連続カンマがありえるなら再度
 for /f "delims=, tokens=1-4" %%a in ("!X!") do (
  if "%%c" == "@" ( ← 第3項が空文字列だったなら第4項も空文字列に
   set "Y=%%a,%%b,,"
  ) else (
   set "Y=%%a,%%b,%%c,%%d"
  )
  set "Y=!Y:,@,=,,!" ←,@,を元に戻す
  set "Y=!Y:,@,=,,!"
  echo !Y!
 )
)
) > output.csv
この回答への補足あり
    • good
    • 0
この回答へのお礼

有り難うございます!
頂いたロジックを試させていただきます。
結果報告は「補足する」に記載させていただきます。

お礼日時:2023/07/28 09:46

> normal-item.csvの中身とファイルの更新日時は変わっていませんでした。



そりゃそうです。今読んでいる最中のファイルは書き変えられません。

すみません、言わなくてもわかると思ってましたが、最終行の、
) > output.csv
というのが、結果の書き込みです。ディレクトリ名付けてないので、カレントディレクトリーにoutput.csvが作られていると思います。
必要に応じてディレクトリー名を追加してください。

念のためですが、
> 頂いた内容をそっくりそのままコピーして、
矢印で始まるコメントは削除していますよね?残ってるとエラーになるのでわかるかと思いますが。
    • good
    • 0
この回答へのお礼

再度のご返信をいただきまして、有り難うございます。
また、当方の返信が遅くなりまして、申し訳ございません。

最終行の ) > output.csv は、normal-item.csvを書き換える為のコマンドと思い込んでいました(汗)
実行後、カレントディレクトリを確認してみましたが、output.csv はありませんでした。
「output.csv」 の前に、自分が確認しやすいディレクトリー名を追加して実行しても、そのディレクトリーの中にoutput.csvは存在しませんでした。

← で始まるコメントは削除させていただいています。
バッチファイルの知識が無い自分でも、流石にこれは分かりました(笑)

バッチファイルで自分の要望を適えるのは凄く難しそうなので、ExcelVBAで対処する事にします。
色々と有り難うございました。

お礼日時:2023/08/03 15:26

(1) 項目数が4固定。


(2) 空文字列(先ほどの回答では「無」と書いたが)があり得るのは第3項のみ。第1、2、4項は絶対に空文字列にならない。

という前提を置いて良ければ、
for /f "tokens=3,4 delims=," %%a in ~~~
で、%%b が空文字列("")と等しければ、第3項が空文字列であることがわかります。
( for /f 的には 111,222,,444 は、項目が3つ(111と222と444)しかないと思っているので、tokens=4に該当する%%bは空文字列です)

> 4番目の項目「在庫数」を空白にする。
というのが、111,222,,4444 => 111,222,, という意味であれば、

(
for /f "tokens=1-4 delims=," %%a in (C:\DL汎用\WEB在庫データ\normal-item.csv) do (
if "%%d" == "" (
echo %%a,%%b,,
) else (
echo %%a,%%b,%%c,%%d
)
)
) > output.csv
    • good
    • 0
この回答へのお礼

再びのご回答、有り難うございます。
「normal-item.csv」のレコードが以下の内容になります。

-------------------------------------------------------
110636,110636,,0
110636,,110636,466

※3行目以降は、上記のパターンを繰り返す。
-------------------------------------------------------

項目3が無のレコードと、項目2が無のレコードが交互に存在します。
項目3=無のレコードなら項目4を無にする、
項目3≠無(項目2=無)のレコードなら何もしない、
というロジックにしたいので、それをするにはIF文が必要かなと考えました。

「項目1・2・4は絶対に空文字列にならない」という前提が成立しないので、私がやりたい事はバッチファイルでは出来ないのかなと思いました。

親身にご回答いただき嬉しく思います。
重ねてお礼申し上げます。

お礼日時:2023/07/27 10:02

コードは間違ってますが、そこを直しても期待通りに動かないかも知れません。


> 3番目の項目「SKU管理番号」が空白なら
の部分ですが、文字通りの意味で「空白」つまり、
aa,bb, ,dd
のようにカンマの間に空白文字が入っているなら判定可能です。コードの間違いを正せば処理可能。

しかし、
aa,bb,,dd
のように「空白」じゃなくて「無」の場合、つまりカンマが連続している場合、for /f の機能だと、3番目の項目は「無」じゃなくて「dd」になります。なぜならば、区切り文字(カンマ)が連続している場合は1つの区切りとして扱われるので。

素直に、PowerShellなど他のツールを使った方が良いです。バッチファイルをよく知っているならそれで頑張る手もありますが、どうせ知らないツールを使うなら、ストレートにカンマ区切りを扱えるツールを使った方が良いです。
    • good
    • 1
この回答へのお礼

ご回答いただき、誠に有り難うございました。

「normal-item.csv」の中身を確認したところ、1番目~4番目の項目が「110636,110636,,0」となっており、3番目の項目「SKU管理番号」は「無」の扱いでした。
とすると、空白判定はできない、という事ですよね。
バッチファイルで空白判定ができないならば、ExcelVBAで組みます。

「無」は空白判定できないという事を初めて知り、勉強になりました。
重ねてお礼申し上げます。

お礼日時:2023/07/26 09:48

とりあえず「全く動きません。

」と判断した理由を聞かせてもらいたい.
    • good
    • 0
この回答へのお礼

「全く動かない」と書いた理由として、当該バッチを実行した後に「normal-item.csv」の中身を見ると何も変わってない、且つ、ファイルの更新日時も変わっていなかったので、「全く動かない」と書かせていただきました。
なので、「全く動かない」と言うと、語弊があるかもしれません。
申し訳ございませんでした。

お礼日時:2023/07/26 09:40

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