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
----------------------------------------------------------------------------------------------
バッチファイルの基本を理解してないので、何が悪いのか全く分かりません。
有識者の方々にご助力いただければ幸甚です。
宜しくお願い致します。
No.2
- 回答日時:
コードは間違ってますが、そこを直しても期待通りに動かないかも知れません。
> 3番目の項目「SKU管理番号」が空白なら
の部分ですが、文字通りの意味で「空白」つまり、
aa,bb, ,dd
のようにカンマの間に空白文字が入っているなら判定可能です。コードの間違いを正せば処理可能。
しかし、
aa,bb,,dd
のように「空白」じゃなくて「無」の場合、つまりカンマが連続している場合、for /f の機能だと、3番目の項目は「無」じゃなくて「dd」になります。なぜならば、区切り文字(カンマ)が連続している場合は1つの区切りとして扱われるので。
素直に、PowerShellなど他のツールを使った方が良いです。バッチファイルをよく知っているならそれで頑張る手もありますが、どうせ知らないツールを使うなら、ストレートにカンマ区切りを扱えるツールを使った方が良いです。
ご回答いただき、誠に有り難うございました。
「normal-item.csv」の中身を確認したところ、1番目~4番目の項目が「110636,110636,,0」となっており、3番目の項目「SKU管理番号」は「無」の扱いでした。
とすると、空白判定はできない、という事ですよね。
バッチファイルで空白判定ができないならば、ExcelVBAで組みます。
「無」は空白判定できないという事を初めて知り、勉強になりました。
重ねてお礼申し上げます。
No.3
- 回答日時:
(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
再びのご回答、有り難うございます。
「normal-item.csv」のレコードが以下の内容になります。
-------------------------------------------------------
110636,110636,,0
110636,,110636,466
※3行目以降は、上記のパターンを繰り返す。
-------------------------------------------------------
項目3が無のレコードと、項目2が無のレコードが交互に存在します。
項目3=無のレコードなら項目4を無にする、
項目3≠無(項目2=無)のレコードなら何もしない、
というロジックにしたいので、それをするにはIF文が必要かなと考えました。
「項目1・2・4は絶対に空文字列にならない」という前提が成立しないので、私がやりたい事はバッチファイルでは出来ないのかなと思いました。
親身にご回答いただき嬉しく思います。
重ねてお礼申し上げます。
No.4ベストアンサー
- 回答日時:
めんどうですが、一旦、,, を ,@, などに変換してからカンマで分割すると空文字列問題は起こらないので、そうするか。
@ は、データ中に出てこない文字。
@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
No.5
- 回答日時:
> normal-item.csvの中身とファイルの更新日時は変わっていませんでした。
そりゃそうです。今読んでいる最中のファイルは書き変えられません。
すみません、言わなくてもわかると思ってましたが、最終行の、
) > output.csv
というのが、結果の書き込みです。ディレクトリ名付けてないので、カレントディレクトリーにoutput.csvが作られていると思います。
必要に応じてディレクトリー名を追加してください。
念のためですが、
> 頂いた内容をそっくりそのままコピーして、
矢印で始まるコメントは削除していますよね?残ってるとエラーになるのでわかるかと思いますが。
再度のご返信をいただきまして、有り難うございます。
また、当方の返信が遅くなりまして、申し訳ございません。
最終行の ) > output.csv は、normal-item.csvを書き換える為のコマンドと思い込んでいました(汗)
実行後、カレントディレクトリを確認してみましたが、output.csv はありませんでした。
「output.csv」 の前に、自分が確認しやすいディレクトリー名を追加して実行しても、そのディレクトリーの中にoutput.csvは存在しませんでした。
← で始まるコメントは削除させていただいています。
バッチファイルの知識が無い自分でも、流石にこれは分かりました(笑)
バッチファイルで自分の要望を適えるのは凄く難しそうなので、ExcelVBAで対処する事にします。
色々と有り難うございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Windows 10 Windowsのバッチファイルで正規表現の置換方法について… 4 2022/12/09 16:00
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Visual Basic(VBA) フォルダの場所を可変にしたいです(マクロ) 4 2023/05/11 10:00
- Visual Basic(VBA) 複数csvを横に追加していくマクロについて 2 2023/04/25 09:19
- Visual Basic(VBA) 【前回の続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/16 16:44
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
- Visual Basic(VBA) VBAでの共有パスにつきまして 1 2023/03/04 17:24
- Visual Basic(VBA) 【ご教示ください】VBAの記述方法がわかりません。 2 2022/08/12 21:28
- Visual Basic(VBA) マクロを教えてください。 7 2023/06/01 19:47
- Visual Basic(VBA) 2つのシートの任意のセルの番号が一致したら、一致した行をコピーする VBA 2 2023/06/19 20:48
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
カンマ区切りのCSVファイルから...
-
特定ファイルの一括削除
-
PHP.laravelについて
-
データ解析ソフトRでのファイル...
-
csvファイルのデータの一部を取...
-
VB6.0 CSVファイル読み込みに...
-
CSV形式での保存時に”文字列...
-
CSVファイル作成
-
Excelで作成した単語帳をp-stu...
-
【エクセル マクロ】読み込ん...
-
エクセルVBA 大容量CSVファイル...
-
ExcelマクロにてCSV出力したデ...
-
巨大なCSVの加工(指定列のみの...
-
VBAでパワーシェルを実行したい...
-
ファイルのアクセス回数について
-
ファイルコピーのスクリプトで...
-
Windows10でコマンドプロンプト...
-
Gitについて質問。 クローンし...
-
【VB.NET】App.configにファイ...
-
EXCEL 検索時の設定
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
カンマ区切りのCSVファイルから...
-
CSV形式での保存時に”文字列...
-
複数のcsvファイルをExcelに一...
-
csvファイル 項目数取得
-
csvファイルでの日付設定「yyyy...
-
バッチでCSVを処理する時、空の...
-
マクロから出力されるcsvのダブ...
-
csvファイルを列数ごとに分割す...
-
エクセル形式のファイルの読み込み
-
csvファイルのデータの一部を取...
-
エクセルVBA 大容量CSVファイル...
-
CSVファイル作成
-
EXCEL|csvで保存→開くcsvを閉じる
-
CSVファイルの項目行を削除...
-
巨大なCSVの加工(指定列のみの...
-
データ解析ソフトRでのファイル...
-
VBAでCSVファイルのデータを集...
-
【ExcelVBA】UTF-8の文字コード...
-
【C#】パス名で無効な文字
-
特定文字を入ってるCSVの特定の...
おすすめ情報
頂いた内容をそっくりそのままコピーして、新たにバッチファイルを作成して試してみたのですが、normal-item.csvの中身とファイルの更新日時は変わっていませんでした。
無の項目を判定するのは厳しいですかね。