前提・実現したいこと
①CSVファイルの先頭列にファイル名が入力された列を追加したい
②①と同様のCSVファイルを最初のファイル以外の先頭行(項目ラベル)を削除して結合したい
発生している問題・エラーメッセージ
現在コマンドプロンプトにて同型のCSVファイルの結合について苦戦しています。
下記のような売上明細のデータを分析したいのですが、何も考えずに一括で結合すると2ファイル名以降の項目ラベル(カテゴリ、担当、購入者)が分析の邪魔になり、かつどの商品のデータなのかがわからなくなってしまいます。
<ファイル>
ドライヤー_4月売上
テレビ_4月売上
ウォーターサーバー_4月売上
・・・
・・・
・・・
・・・
<ファイルの中身>
カテゴリ 担当者 購入者 購入日
家電 佐藤 田中 4/6 ←ファイル名がないので何の商品の売上なのかわからない
家電 佐藤 高橋 4/8
・ ・ ・ ・
・ ・ ・ ・
・ ・ ・ ・
カテゴリ 担当者 購入者 購入日 ←結合すると2ファイル目以降のラベルが分析の邪魔に。
キッチン 宮下 栗原 4/2
キッチン 宮下 桃井 4/11
<理想の状態>
ファイル名 カテゴリ 担当者 購入者 購入日
ドライヤー 家電 佐藤 田中 4/6
ドライヤー 家電 佐藤 高橋 4/8
・ ・ ・ ・
・ ・ ・ ・
ドライヤー 家電 佐藤 高橋 4/8
ミキサー キッチン 宮下 栗原 4/2 ←2ファイル目以降の項目ラベルを削除
ミキサー キッチン 宮下 桃井 4/11
↑
ファイル名が全レコードに挿入
試したこと
別々の処理だったら可能なのですが、同時に処理を行うことができずに困っています。
<2ファイル目以降のヘッダー削除>
@echo off
setlocal enabledelayedexpansion
set /a counter=0
for /f %%i in ('dir /b *.csv') do (
echo %%i
if !counter!==0 (
set /p _head=<%%i
echo !_head!>>result.csv
)
set /a counter=!counter!+1
for /f "tokens=* skip=1" %%b in (%%i) do (
echo %%b>>result.csv
)
)
pause
<先頭列に結合前データ名を挿入>
@echo off
for %%F in (*.csv) do (
for /f "delims=" %%L in (%%F) do (
echo %%F,%%L
)
)
補足情報(FW/ツールのバージョンなど)
win10を使用しています。
なにかあと少しでできそうな予感はあるのですが最後の一歩がうまくいかず大変悔しい思いをしています。どうかご協力をお願い致します。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
全てをバッチファイルに行わせると分からないので、処理を行うPowerShellスクリプトをバッチファイルで呼び出す形式にしてみました。
一案としてどうぞ。
以下のtest.bat, test.ps1を作成し、CSVファイル群と同じフォルダに置いて、test.batを実行します。
----- test.bat
powershell -executionpolicy bypass .\test.ps1
----- ここまで
----- test.ps1
$output = "result.csv"
#既存の$outfile削除
$output = Join-Path -Path $(Get-Location) -ChildPath $output
if(Test-Path -Path $output -ne $null) { Remove-Item -Path $output }
$first_file = $true
Get-ChildItem *.csv | %{
#個々のCSVファイルについて処理
$first_line = $true
$file_name = $_.BaseName
Get-Content -LiteralPath $_ | %{
#各行について処理
if($first_file -and $first_line){
#最初のファイルの1行目
$first_file = $false
$first_line = $false
"ファイル名," + $_ | Out-File -FilePath $output -Encoding default
}elseif($first_line){
#2番目以降のファイルの1行目
$first_line = $false
}else{
#2行目以降
$file_name + "," + $_ | Out-File -FilePath $output -Encoding default -Append
}
}
}
----- ここまで
No.1
- 回答日時:
上の奴で, 中の for を下の奴に合わせて
for /f "delims= skip=1" %%L in (%%i) do (
echo %%F,%%L
)
のようにしてもだめなんだっけ?
ちなみに上の奴は「counter」ってあるけど, 実際にファイル数を数える必要ないと思うよ.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) Windowsのバッチファイルについてご教示ください 5 2023/07/25 20:23
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- その他(プログラミング・Web制作) データ解析ソフトRでのファイル入力read.csvがエラーになります 7 2022/03/27 22:11
- Access(アクセス) access,vbaでフォルダ内のファイルをテーブルにインポート、ファイル名もフィールドに追加したい 1 2022/08/31 11:11
- その他(プログラミング・Web制作) Pythonで、データファイルと列名ファイルを1つのファイルにしたいです。 1 2023/07/27 20:29
- Visual Basic(VBA) VBA初心者です。電話番号の数字の前に0を表示させたいです。 2 2022/12/14 03:58
- その他(プログラミング・Web制作) python 気象データの取得 2 2023/06/20 23:54
- Visual Basic(VBA) 複数csvを横に追加していくマクロについて 2 2023/04/25 09:19
- その他(データベース) Excel VBA 転記について 1 2022/04/20 16:55
- Visual Basic(VBA) VBAで特定の場所にあるCSVファイル(複数)から特定場所を抜き出してExcelに転記したいです。 11 2023/05/23 16:29
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
コマンドプロンプトの「%1」と...
-
コマンドプロンプトで変数が数...
-
バッチファイルで、iniファイル...
-
バッチコマンドでファイル名の...
-
コマンドプロンプトでファイル...
-
[DOS] コピー先に同じファイル...
-
ftp処理でmove(移動)を行いたい
-
【バッチファイル】forコマンド...
-
VBA GetAttrについて教えてくだ...
-
ExcelVBAのDirでスペース含むフ...
-
【Access】エクスポート時のフ...
-
フォルダ内の更新日時が一番新...
-
VB6.0 Dir関数について
-
ファイル名に ” を使うと エク...
-
ファイルの削除でゴミ箱に送りたい
-
【VBScript】※渡したい変数のみ...
-
■ファイルのリネーム(rename)...
-
ExifToolでの文字化け対策
-
access,vbaでフォルダ内のファ...
-
サブフォルダからファイルをコ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コマンドプロンプトの「%1」と...
-
コマンドプロンプトで変数が数...
-
コマンドプロンプトでファイル...
-
バッチファイルで、iniファイル...
-
[DOS] コピー先に同じファイル...
-
バッチコマンドでファイル名の...
-
ftp処理でmove(移動)を行いたい
-
access,vbaでフォルダ内のファ...
-
ExcelVBAのDirでスペース含むフ...
-
フォルダ内の更新日時が一番新...
-
DOSのバッチ作成について‐FORの...
-
word VBA ファイル名 保存
-
ファイル名に ” を使うと エク...
-
.batでファイル名から抽出して...
-
ファイル名を該当フォルダ内か...
-
サブフォルダからファイルをコ...
-
【vbs】ファイル名の検索と該当...
-
【DOSバッチ開発】末尾のタブの...
-
VBA GetAttrについて教えてくだ...
-
バッチ処理で16進数でファイル...
おすすめ情報